python - 无法使用另一列的值作为 Series 的键为 pandas DataFrame 中的列分配值

标签 python pandas dataframe series

考虑一个带有 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'] 包含字母 AJ,但它全是 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/

相关文章:

python - 从 Pandas 数据框中获取重复值的位置

python - 对内部级别的多索引列进行操作

r - 如何定义2列指标

python - socketserver - 允许重用地址重新绑定(bind)现有端口号在不覆盖类变量的情况下不起作用

python - 按自定义年度频率重新采样

python - 如何运行与Dockerfile分开存放在单独文件夹中的python文件?

python - 使用 Pandas 替换不同列的元素

python - 如何将 Pandas 中的单个时间序列转换为多个序列

python - 1 作为函数声明中的参数类型

python - Numba 矢量化最大化所有处理器