前言
我嘗試給pandas中篩選后數(shù)據(jù)的某行某列賦值時肿男,提示SettingWithCopyWarning:
舶沛,是說不能直接對副本進(jìn)行數(shù)據(jù)修改如庭。
問題復(fù)現(xiàn)
原始數(shù)據(jù)
image.png
此處
year-month-day
為簽到日期骤竹,diff
是我想計算的連續(xù)簽到天數(shù)蒙揣,如果下一行減去本行為1懒震,則計為連續(xù)簽到天數(shù)挎狸,diff
的值+1锨匆。
我原來的賦值方法:
df.loc[df['user_id'] == i,'diff'].iloc[j] = 1# 報錯恐锣,其中i為第i個user_id的值土榴,j為同一user_id的第j行
這里我通過df.loc[df[xx]==i,'yy'].iloc[j] = zz
賦值(xx玷禽、yy均為列名)矢赁,其中df.loc[df[xx]==i]
后直接賦值是可以的,df.loc[df[xx]==i]
為df的一個子集贬丛,即view或視圖撩银,而df.loc[df[xx]==i,'yy'].iloc[j]
為df的一個副本,是不能直接賦值的(但是可以print查看)豺憔。
處理方法(供參考恭应,不適用所有場景)
我的處理方法比較傻:先把df.loc[df[xx]==i].copy()
賦給一個臨時變量dfx
抄邀,然后dfx.iloc[j,dfx.columns.get_loc('yy')] = zz
計算完后再把臨時變量賦值回原df昼榛,即df.loc[df[xx]==i,'yy'] = dfx['yy']
准夷。
處理后的結(jié)果:
image.png
總結(jié)(不想看前面廢話請看這里:)
1彻秆,建議只使用一個loc或一個iloc方法賦值酒朵,即df.loc[xx]=zz
或df.iloc[xx]=zz
;不能同時使用loc和iloc賦值留夜,即df.loc[xx].iloc[yy]=zz
匙铡。
2,如果想實現(xiàn)1中同時使用loc和iloc后進(jìn)行賦值碍粥,可先用臨時變量存loc的值鳖眼,再對臨時變量進(jìn)行iloc的運(yùn)算,處理后再賦值回原變量