无法使用另一列的值作为系列键为 Pandas DataFrame 中的列分配值

Joh*_*ker 4 python series dataframe pandas

考虑一个带有 Dataframedf和 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']]
Run Code Online (Sandbox Code Playgroud)

在这一点上我希望df['b']到包含字母A通过J,而是它的所有NaN。但是,如果我用

n = df['a'][2]
df['c'] = s[n]
Run Code Online (Sandbox Code Playgroud)

thendf['c']充满了Cs,正如我所料,所以我很确定这不是一些奇怪的类型错误。

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

unu*_*tbu 6

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
Run Code Online (Sandbox Code Playgroud)

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

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

df['b'] = s[df['a']].values
Run Code Online (Sandbox Code Playgroud)

对于索引匹配的演示,请注意如何

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']]
Run Code Online (Sandbox Code Playgroud)

产量

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]
Run Code Online (Sandbox Code Playgroud)

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