无法使用另一列的值作为Series'键为pandas DataFrame中的列指定值

时间:2014-01-28 02:22:48

标签: python pandas dataframe series

考虑使用数据框df和系列s

的简单示例
import pandas as pd

matching_vals = range(20,30)

df = pd.DataFrame(columns=['a'], index=range(0,10))
df['a'] = matching_vals
s  = pd.Series(list("ABCDEFGHIJ"), index=matching_vals)

df['b'] = s[df['a']]

此时我希望df['b']包含字母AJ,而是全部NaN。但是,如果我用

替换最后一行
n = df['a'][2]
df['c'] = s[n]

然后df['c']充满了C s,正如我所料,所以我很确定这不是一个奇怪的类型错误。

我是熊猫的新手,这让我发疯了。

1 个答案:

答案 0 :(得分:3)

s[df['a']]的索引与df的索引不同:

In [104]: s[df['a']]
Out[104]: 
a
20    A
21    B
22    C
23    D
24    E
25    F
26    G
27    H
28    I
29    J

当您将Series分配给DataFrame的列时,Pandas会尝试根据索引分配值。由于s[df['a']]没有与df的索引关联的任何值,因此会分配NaN个值。该分配不会向df添加新行。

如果您不希望索引进入作业,则可以使用

df['b'] = s[df['a']].values

有关索引匹配的演示,请注意

import pandas as pd

df = pd.DataFrame(columns=['a'], index=range(0,10))
df['a'] = range(0,10)[::-1]
s  = pd.Series(list("ABCDEFGHIJ"), index=range(0,10)[::-1])
df['b'] = s[df['a']]

产量

In [123]: s[df['a']]
Out[123]: 
a
9    A
8    B
7    C
6    D
5    E
4    F
3    G
2    H
1    I
0    J
dtype: object

In [124]: df
Out[124]: 
   a  b
0  9  J
1  8  I
2  7  H
3  6  G
4  5  F
5  4  E
6  3  D
7  2  C
8  1  B
9  0  A

[10 rows x 2 columns]

“翻转”df['b']的值以使索引匹配。