考虑一个带有 Dataframe df
和 Series 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']
包含字母 A
到 J
,但它全是 NaN
。但是,如果我用
n = df['a'][2]
df['c'] = s[n]
然后 df['c']
充满了 C
,正如我所料,所以我很确定这不是一些奇怪的类型错误。
我是 Pandas 的新手,这让我发疯。
最佳答案
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']
的值被“翻转”以使索引匹配。
关于python - 无法使用另一列的值作为 Series 的键为 pandas DataFrame 中的列分配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21395677/