pandas DataFrame 賦值的注意事項說明(index)
一 pandas DataFrame一列賦值問題
說明,把b的列賦值給a
情況1:a,b index設置相同
如下代碼
import pandas as pd import numpy as np a = pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz')) b = pd.DataFrame(np.array([11,22,33,44]),index=list('abcd'),columns=['m']) a['m'] = b['m'] print(a)
上述代碼結果如下
w x y z m a 0 1 2 3 11 b 4 5 6 7 22 c 8 9 10 11 33 d 12 13 14 15 44
情況一是最基本的情況,結果也符合預期,之所以符合預期是因為a,b都設有同樣的index,賦值操作按照index來到。如果b不設置Index,而是使用默認的index呢?
情況2:b的index采用默認值
代碼如下
import pandas as pd import numpy as np a = pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz')) b = pd.DataFrame(np.array([11,22,33,44]),columns=['m']) a['m'] = b['m'] print(a)
結果如下
w x y z m a 0 1 2 3 NaN b 4 5 6 7 NaN c 8 9 10 11 NaN d 12 13 14 15 NaN
情況二,結果超出了想象,b中的index為0,1,2,3與a中的index(‘a(chǎn)',‘b',‘c',‘d')不同,在賦值的過程中,是按照a中的index在b中找index相同位置的值,由于index不同,因此,給a賦值為NaN
情況三 : b中的部分Index與a中的相同
代碼如下
import pandas as pd import numpy as np a = pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz')) b = pd.DataFrame(np.array([11,22,33,44]),index=list('arpb'),columns=['m']) a['m'] = b['m'] print(a)
結果如下
w x y z m a 0 1 2 3 11.0 b 4 5 6 7 44.0 c 8 9 10 11 NaN d 12 13 14 15 NaN
由情況三結果可知,只有Index相同的行,賦值才能成功
總結:
從以上可以看出,Pandas DataFrame嚴格按照Index進行賦值,如果Index不同的話,則賦值為NaN
補充:python編程過程中DataFrame修改特定單元格值后原數(shù)據(jù)不變的一個解決方案
最近在參加了一個比賽,里面設計到數(shù)據(jù)清洗的工作,需要對一些異常值作出修改,往常我都是這樣操作的
df[condition]['column'].iloc[0:3] = ......
或者
df[condition]['column'][0:3] = ......
里面condition代表滿足條件的邏輯表達式,column表示列名
一般還是管用的,但偶爾會出現(xiàn)錯誤,主要是df[condition]這種表達在python里面是不夠規(guī)范的,因此運行以后單元格容易賦值失敗。在嘗試了很多種方法之后,最后還是使用規(guī)范的loc或者iloc表達
df.loc[[row condition],['column']] = ......
例如:
NA.loc[[23,29,49],'北美整體規(guī)模'] = ......
或者
df.iloc[np.where(condition),[1:3]]
注意loc里面接的是具體的行列名稱,iloc里面接的是滿足條件的行列名稱所對應的位置數(shù)字列表,切忌弄混!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
matplotlib 縱坐標軸顯示數(shù)據(jù)值的實例
今天小編就為大家分享一篇matplotlib 縱坐標軸顯示數(shù)據(jù)值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05