2016-03-20 61 views
0

有一件我不明白的與大熊貓ix選擇器。有重複索引的熊貓奇怪的ix選擇

考慮下面的數據幀

dfnu=pd.DataFrame({'A':[7,1,2,3,4],'B':[7,8,9,1,1]},index=list('AABCD')) 

現在看這個輸出

dfnu['A']<2 
Out[128]: 
A False 
A  True 
B False 
C False 
D False 
Name: A, dtype: bool 


dfnu['test']=dfnu.ix[dfnu['A']<2,'A'] 
dfnu 
Out[127]: 
    A B test 
A 7 7  1 
A 1 8  1 
B 2 9 NaN 
C 3 1 NaN 
D 4 1 NaN 

這到底是怎麼回事呢?爲什麼在第一行上test等於1?

+0

結果:'dfnu.ix [ dfnu.A <2,'test'] = 1'那麼你會有預期的結果 – MaxU

回答

1

由於只有一用一< 2排,dfnu.ix[dfnu['A'<2, 'A']只有一個值:

>>> dfnu.ix[dfnu['A']<2, 'A'] 
A 1 
Name: A, dtype: int64 

當你將這個回dfnu,該值是對指數相匹配。換句話說,因爲上面顯示的一行具有A作爲索引,所以其值(1)被分配給原始DataFrame中具有A作爲索引的每一行。這也是爲什麼你爲其他行獲得NaN的原因;因爲它們沒有A作爲索引,所以沒有值分配給它們。

+0

謝謝。但是我認爲在行'dfnu ['test'] = dfnu.ix [dfnu ['A'] <2,'A']'的行中受逐行匹配的簡單匹配影響。也就是說,左側的第一行等於左側的第一行等等(不涉及索引)。這是不正確的? –

+1

@Noobie:當你的例子中,左邊有五行但右邊只有一行? – BrenBarn

+0

好的,我明白了。我想到的是'dfnu.ix [dfnu ['A'] <2,'test2'] = dfnu.ix [dfnu ['A'] <2,'A']'。該死的,熊貓很強大,但它有時會被徵收;-) –

1

你可以這樣說:

dfnu.ix[dfnu.A < 2, 'test'] = 1 

輸出

In [289]: dfnu 
Out[289]: 
    A B 
A 7 7 
A 1 8 
B 2 9 
C 3 1 
D 4 1 

In [290]: dfnu.ix[dfnu.A < 2, 'test'] = 1 

In [291]: dfnu 
Out[291]: 
    A B test 
A 7 7 NaN 
A 1 8 1.0 
B 2 9 NaN 
C 3 1 NaN 
D 4 1 NaN 

它會給你你想用這種方式,你想