Python 从另一列的选定值创建DataFrame列

Python 从另一列的选定值创建DataFrame列,python,pandas,Python,Pandas,比如说,我有这样一个数据帧: df = pd.DataFrame({'a' : list('abcdefghij'), 'b' : (5*[2] + 5*[3])}) df['c'] = df['a'].iloc[df['b']] 我想创建另一列,其中包含列'a'中的值,这些值在列'b'中被索引(5倍'c'和5倍'd')。那么,对我来说,这样做似乎是很自然的: df = pd.DataFrame({'a' : list('abcdefghij'), 'b' : (5*[2] + 5*[3])

比如说,我有这样一个数据帧:

df = pd.DataFrame({'a' : list('abcdefghij'), 'b' : (5*[2] + 5*[3])})
df['c'] = df['a'].iloc[df['b']]
我想创建另一列,其中包含列
'a'
中的值,这些值在列
'b'
中被索引(5倍'c'和5倍'd')。那么,对我来说,这样做似乎是很自然的:

df = pd.DataFrame({'a' : list('abcdefghij'), 'b' : (5*[2] + 5*[3])})
df['c'] = df['a'].iloc[df['b']]
但这会产生一个错误:

cannot reindex from a duplicate axis
我的问题是

a) 我该怎么做


b) 与直觉相反,我在哪里可以了解熊猫指数的实际机制?

如果我理解正确,您希望:

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
然后应该清楚它为什么抱怨,索引值在重复,pandas试图将索引与原始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)

我不太明白您想要什么,
df[df['a'].isin(df['b']]]
将返回“b”中存在的“a”值,但您似乎正在用基本相同的值覆盖“b”values@EdChum我想,分配给同一列并使用与索引相同的
a
值有点误导。我改变了问题;这更有意义吗?我仍然不明白你想要什么样的预期输出,如果你只是想要相关列的值(不包括索引),你可以使用
。值
df['c']=df['a'].iloc[df['b']]。值
df['c']=df.loc[df['b'],'a']
。@EdChum:是的,但这仍然给了我同样的错误。@安塞尔:那很有效,非常感谢!在回答中解释为什么这样做有效而另一件事情无效,我会接受。