pandas如何逐行需改DataFrame


逐行修改DataFrame而不會報SettingwithCopyWarning警告的方法:

df.iloc[行數,df.columns.get_loc(列名)]=new_value

參考:https://cloud.tencent.com/developer/ask/168023/answer/270064

逐行修改數據時,我們可能關注或只記得列名,這時使用df.iloc或者df.loc都不合適,因為是混合索引,但使用df.ix[行號,列名]=new_value又會報SettingwithCopyWarning,因此只能用上述方法,df.columns.get_loc(列名)這個方法會返回列名所在的列數,得到這個數值,就可以使用df.iloc了。

'''以下方式逐行修改數據,但由於需要讀取、寫入兩個操作,會報警告
num=df.shape[0]
for i in range(num):
row=.iloc[i]
row['my_col']=(num+1)/num
df.iloc[i]=row
'''

#以下方式不會報警,且避免了df.ix[index,column]已過時的警告 df.iloc[i,df.columns.get_loc('my_col')]=(num-i)/num

 

引申:df[布爾表達式]['my_col']=new_value 這樣的寫法為何會報SettingwithCopyWarning ?

因為這種寫法存在修改副本(即類似表與視圖的關系)的情況,其中df[布爾表達式]會返回一個df的子集副本,而['my_col']=new_value 是寫入,是寫入到副本,這種寫入可能是無效的,因為副本不會自動保存到原始DataFrame。解決辦法是使用df.loc或者df.iloc,且loc或iloc后面只使用一個中括號[],這樣可以保證,df.loc[行索引,列名]=new_value直接操作原始表。

參考:Pandas 中 SettingwithCopyWarning 的原理和解決方案

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM