2017-04-27 64 views
3

爲什麼此操作失敗? 例如:在熊貓數據框的多列上使用fillna方法失敗

a = pd.DataFrame({'a': [1,2,np.nan, np.nan], 
       'b': [5,np.nan,6, np.nan], 
       'c': [5, 1, 5, 2]}) 


a[['a', 'b']].fillna(0, inplace=True) 

,給了我這樣的警告:

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

a仍與NA S作爲前填充。不過,如果我分別在每列上撥打.fillna(),則不會有任何問題。我怎樣才能在一個鏡頭中填寫多個列上的NA值?

+0

到fillna只是a.fillna(0,就地= TRUE) – Vaishali

回答

3

選項1

a.loc[:, ['a', 'b']] = a[['a', 'b']].fillna(0) 

print(a) 

    a b c 
0 1.0 5.0 5 
1 2.0 0.0 1 
2 0.0 6.0 5 
3 0.0 0.0 2 

選項2

a.update(a[['a', 'b']].fillna(0)) 

print(a) 

    a b c 
0 1.0 5.0 5 
1 2.0 0.0 1 
2 0.0 6.0 5 
3 0.0 0.0 2 

選項3

for col in ['a', 'b']: 
    a[col].fillna(0, inplace=True) 

print(a) 

    a b c 
0 1.0 5.0 5 
1 2.0 0.0 1 
2 0.0 6.0 5 
3 0.0 0.0 2 

選項4

a.fillna(a[['a', 'b']].fillna(0), inplace=True) 

print(a) 

    a b c 
0 1.0 5.0 5 
1 2.0 0.0 1 
2 0.0 6.0 5 
3 0.0 0.0 2 
+0

您可以通過25秒:) – Vaishali

+0

非常感謝打我!爲什麼在多列和單列上的'fillna'之間有這樣的區別,即使同時標記'inplace = True'? –

+0

因爲'a [['a','b']]'是一個視圖/切片,並且在使用'inplace = True'時會產生警告。 'a.loc [:['a','b']]'不會在'inplace = True'的情況下發出警告,但它會在沒有幫助的副本上執行。我的***選項4 ***用'inplace = True'顯示它,因爲我正在使用'a'本身,但是填充另一個已填充的數據幀... btw ***選項4 * **是荒謬的,請不要實際使用它。 – piRSquared

2

編輯:由於@piRSquared指出的那樣,在第一解決方案應該是

a.loc[:, ['a', 'b']] = a[['a', 'b']].fillna(0) 

在選定列

到fillna
a.fillna(0, inplace = True) 

中的所有列

+0

'a.loc [:, ['a','b']]。fillna(0,inplace = True)'填充副本。第二個作品,但將填補''c'',如果它有空的 – piRSquared

+0

噢好吧,糟糕的一天我猜:( – Vaishali

+1

你顯然看到多少答案馬克西姆,jezrael,我忍不住......相信我,我很高興能有另一個人積極回答熊貓的問題,我只是在尋找你:-) – piRSquared