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:是的,但这仍然给了我同样的错误。@安塞尔:那很有效,非常感谢!在回答中解释为什么这样做有效而另一件事情无效,我会接受。