2016-08-23 90 views
0

索引使用我有一個熊貓數據幀TDF 我基於布爾標籤熊貓切片,並用fillna

idx = tdf['MYcol1'] == 1 
myslice = tdf.loc[idx] //I want myslice to be a view not a copy 

提取切片現在我要填寫myslice的列中的缺失值我想這反映在TDF我原來的數據幀以上

myslice.loc[:,'MYcol2'].fillna(myslice['MYcol2'].mean(), inplace = True) // 1 
myslice.ix[:,'MYcol2'].fillna(myslice['MYcol2'].mean(), inplace = True) // 2 

1和2都扔警告ŧ hat:試圖在DataFrame的一個切片副本上設置一個值

我在做什麼錯誤?

+0

據我所知,你不能那樣做。一旦你將它分配給一個新的變量,它就變成了一個副本。你需要用tdf.loc [idx,'MYcol2']'來使用繁瑣的版本。 – ayhan

回答

2

當您將它分配給一個新變量時,它會創建一個副本。之後你做的事情是無關緊要的。試想一下:

tdf 
Out: 
      A   B   C 
0  NaN 0.195070 -1.781563 
1 -0.729045 0.196557 0.354758 
2 0.616887 0.008628  NaN 
3  NaN  NaN 0.037006 
4 0.767902  NaN  NaN 
5 -0.805627  NaN  NaN 
6 1.133080  NaN -0.659892 
7 -1.139802 0.784958 -0.554310 
8 -0.470638 -0.216950  NaN 
9 -0.392389 -3.046143 0.543312 
idx = tdf['A'] > 0 
myslice = tdf.loc[idx] 

填寫NaN的在myslice:

myslice.loc[:,'B'].fillna(myslice['B'].mean(), inplace = True) 
C:\Anaconda3\envs\p3\lib\site-packages\pandas\core\generic.py:3191: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    self._update_inplace(new_data) 

myslice 
Out: 
      A   B   C 
2 0.616887 0.008628  NaN 
4 0.767902 0.008628  NaN 
6 1.133080 0.008628 -0.659892 

tdf 
Out: 
      A   B   C 
0  NaN 0.195070 -1.781563 
1 -0.729045 0.196557 0.354758 
2 0.616887 0.008628  NaN 
3  NaN  NaN 0.037006 
4 0.767902  NaN  NaN 
5 -0.805627  NaN  NaN 
6 1.133080  NaN -0.659892 
7 -1.139802 0.784958 -0.554310 
8 -0.470638 -0.216950  NaN 
9 -0.392389 -3.046143 0.543312 

它並沒有反映在TDF,因爲:

myslice.is_copy 
Out: <weakref at 0x000001CC842FD318; to 'DataFrame' at 0x000001CC8422D6A0> 

如果將其更改爲:

tdf.loc[:, 'B'].fillna(tdf.loc[idx, 'B'].mean(), inplace=True) 

tdf 
Out: 
      A   B   C 
0  NaN 0.195070 -1.781563 
1 -0.729045 0.196557 0.354758 
2 0.616887 0.008628  NaN 
3  NaN 0.008628 0.037006 
4 0.767902 0.008628  NaN 
5 -0.805627 0.008628  NaN 
6 1.133080 0.008628 -0.659892 
7 -1.139802 0.784958 -0.554310 
8 -0.470638 -0.216950  NaN 
9 -0.392389 -3.046143 0.543312 

然後它工作。在最後一部分中,您還可以使用myslice['B'].mean(),因爲您沒有更新這些值。但左側應該是原始的DataFrame。

+0

謝謝,所以如果有多個條件和東西,我不得不寫一個冗長乏味的代碼行,是嗎? –

+0

如果我只想填充那些滿足條件的東西,tdf.loc [idx,'B']。fillna()不會這樣做 –

+0

您可以將條件保存在布爾掩碼中('mask =(df [' A']> 0)&(df ['B'] <0)|(df ['C']> 0.2)')並在操作中使用該掩碼。 – ayhan