2015-06-25 80 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)