A value is trying to be set on a copy of a slice from a DataFrame

前言

我嘗試給pandas中篩選后數(shù)據(jù)的某行某列賦值時(shí),提示SettingWithCopyWarning:,是說(shuō)不能直接對(duì)副本進(jìn)行數(shù)據(jù)修改。

問(wèn)題復(fù)現(xiàn)

原始數(shù)據(jù)

image.png

此處year-month-day為簽到日期,diff是我想計(jì)算的連續(xù)簽到天數(shù),如果下一行減去本行為1,則計(jì)為連續(xù)簽到天數(shù),diff的值+1。

我原來(lái)的賦值方法:

df.loc[df['user_id'] == i,'diff'].iloc[j] = 1# 報(bào)錯(cuò),其中i為第i個(gè)user_id的值,j為同一user_id的第j行
這里我通過(guò)df.loc[df[xx]==i,'yy'].iloc[j] = zz賦值(xx、yy均為列名),其中df.loc[df[xx]==i]后直接賦值是可以的,df.loc[df[xx]==i]為df的一個(gè)子集,即view或視圖,而df.loc[df[xx]==i,'yy'].iloc[j]為df的一個(gè)副本,是不能直接賦值的(但是可以print查看)。

處理方法(供參考,不適用所有場(chǎng)景)

我的處理方法比較傻:先把df.loc[df[xx]==i].copy()賦給一個(gè)臨時(shí)變量dfx,然后dfx.iloc[j,dfx.columns.get_loc('yy')] = zz計(jì)算完后再把臨時(shí)變量賦值回原df,即df.loc[df[xx]==i,'yy'] = dfx['yy']

處理后的結(jié)果:

image.png

總結(jié)(不想看前面廢話請(qǐng)看這里:)

1,建議只使用一個(gè)loc或一個(gè)iloc方法賦值,即df.loc[xx]=zzdf.iloc[xx]=zz;不能同時(shí)使用loc和iloc賦值,即df.loc[xx].iloc[yy]=zz。
2,如果想實(shí)現(xiàn)1中同時(shí)使用loc和iloc后進(jìn)行賦值,可先用臨時(shí)變量存loc的值,再對(duì)臨時(shí)變量進(jìn)行iloc的運(yùn)算,處理后再賦值回原變量

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.運(yùn)行一段代碼,出現(xiàn)警示錯(cuò)誤,但是程序還是正常運(yùn)行 錯(cuò)誤如下: 解決方案: stackoverflow解決方案連...
    書生_Scholar閱讀 15,603評(píng)論 0 0
  • 寫在前面的話 在做天文數(shù)據(jù)處理的過(guò)程中,基本上是和類表格數(shù)據(jù)打交道,因此在處理天文數(shù)據(jù)的過(guò)程中pandas就是自己...
    YuAllon閱讀 1,103評(píng)論 0 3
  • Data Analysis 算法基礎(chǔ), 工具框架算法模型的選擇使用, 業(yè)務(wù)方面(金融等)需要掌握 算法推導(dǎo)過(guò)程了解...
    d032a642d9de閱讀 549評(píng)論 0 0
  • 一、Dataframe的三個(gè)參數(shù) 1、data數(shù)據(jù),只輸入數(shù)據(jù)參數(shù),會(huì)默認(rèn)添加行索引和列索引,值為0,1,2......
    mhslwm閱讀 1,832評(píng)論 0 0
  • os模塊用法大全 os.listdir(dirname):列出dirname下的目錄和文件 os.getcwd()...
    南天一星辰mical閱讀 438評(píng)論 0 0

友情鏈接更多精彩內(nèi)容