2015-06-25 119 views
0

說創建大熊貓據幀列,我有這樣一個數據幀:從選擇的值從另一列

df = pd.DataFrame({'a' : list('abcdefghij'), 'b' : (5*[2] + 5*[3])}) 

而且我想創建一個包含從'a'列,其在'b'列索引這些值的另一列( 5次'c'和5次'd')。然後,它會很自然的對我來說,做這樣的事情:

df['c'] = df['a'].iloc[df['b']] 

但是,這會產生一個錯誤:

cannot reindex from a duplicate axis 

我的問題是

一)我該怎麼辦呢?

b)在哪裏可以瞭解熊貓指數的實際機制,而不是直覺?

+0

我不太明白你想要什麼,'df [df ['a']。isin(df ['b'])]'將返回'b'中存在的'a'但你似乎用基本相同的值覆蓋'b' – EdChum

+0

@EdChum我想,分配給同一列,並使用與索引相同的'a'值有點誤導。我改變了這個問題;這是否更有意義? –

+0

我還是不明白你想要的輸出是什麼,如果你只是想要相關列的值(排除索引),你可以使用'.values':'df ['c'] = df ['a' ] .iloc [df ['b']] values' – Anzel

回答

0

如果我正確理解你想要的是:

In [219]: 
df['c'] = df.loc[df['b'],'a'].values 
df 

Out[219]: 
    a b c 
0 a 2 c 
1 b 2 c 
2 c 2 c 
3 d 2 c 
4 e 2 c 
5 f 3 d 
6 g 3 d 
7 h 3 d 
8 i 3 d 
9 j 3 d 

至於爲什麼你得到「不能從重複軸重新索引」如果你觀察到了什麼它的返回:

In [220]: 
df.loc[df['b'],'a'] 

Out[220]: 
2 c 
2 c 
2 c 
2 c 
2 c 
3 d 
3 d 
3 d 
3 d 
3 d 
Name: a, dtype: object 

那麼它應該要清楚它爲什麼會呻吟,索引值是重複的,並且熊貓正在嘗試將索引與原始df對齊,爲了解決這個問題,可以通過調用.values屬性獲得原始值作爲np數組:

In [221]: 
df.loc[df['b'],'a'].values 

Out[221]: 
array(['c', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd'], dtype=object)