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’,‘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修改特定單元格值後原數據不變的一個解決方案

最近在參加瞭一個比賽,裡面設計到數據清洗的工作,需要對一些異常值作出修改,往常我都是這樣操作的

df[condition]['column'].iloc[0:3] = ......

或者

df[condition]['column'][0:3] = ......

裡面condition代表滿足條件的邏輯表達式,column表示列名

一般還是管用的,但偶爾會出現錯誤,主要是df[condition]這種表達在python裡面是不夠規范的,因此運行以後單元格容易賦值失敗。在嘗試瞭很多種方法之後,最後還是使用規范的loc或者iloc表達

df.loc[[row condition],['column']] = ......

例如:

NA.loc[[23,29,49],'北美整體規模'] = ......

或者

df.iloc[np.where(condition),[1:3]]

註意loc裡面接的是具體的行列名稱,iloc裡面接的是滿足條件的行列名稱所對應的位置數字列表,切忌弄混!

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。