Pandas 应用 returns 矩阵而不是单列

Pandas Apply returns matrix instead of single column

这可能是一个愚蠢的问题,但我已经尝试了一段时间,但似乎无法让它工作。

我有一个数据框:

   df1 = pd.DataFrame({'Type': ['A','A', 'B', 'F', 'C', 'G', 'A', 'E'], 'Other': [999., 999., 999., 999., 999., 999., 999., 999.]})

我现在想根据列 Type 创建一个新列。为此,我有第二个数据框:

    df2 = pd.DataFrame({'Type':['A','B','C','D','E','F', 'G'],'Value':[1, 1, 2, 3, 4, 4, 5]})

我正在用作查找 table。

当我尝试类似的操作时:

    df1.apply(lambda x: df2.Value[df2.Type == x['Type']],axis=1)

我得到一个矩阵而不是单列:

    Out[21]: 
        0   1   2   4   5   6
    0   1 NaN NaN NaN NaN NaN
    1   1 NaN NaN NaN NaN NaN
    2 NaN   1 NaN NaN NaN NaN
    3 NaN NaN NaN NaN   4 NaN
    4 NaN NaN   2 NaN NaN NaN
    5 NaN NaN NaN NaN NaN   5
    6   1 NaN NaN NaN NaN NaN
    7 NaN NaN NaN   4 NaN NaN

然而我想要的是:

        0
    0   1
    1   1
    2   1
    3   4
    4   2
    5   5
    6   1
    7   4

我做错了什么?

您可以使用 map 来实现:

In [62]:
df1['Type'].map(df2.set_index('Type')['Value'],na_action='ignore')

Out[62]:
0    1
1    1
2    1
3    4
4    2
5    5
6    1
7    4
Name: Type, dtype: int64

如果您将 apply 尝试修改为以下内容,那么它将起作用:

In [70]:
df1['Type'].apply(lambda x: df2.loc[df2.Type == x,'Value'].values[0])

Out[70]:
0    1
1    1
2    1
3    4
4    2
5    5
6    1
7    4
Name: Type, dtype: int64

如果我们看看您的尝试:

df1.apply(lambda x: df2.Value[df2.Type == x['Type']],axis=1)

这是试图将 'type' 和 return 与 'value' 进行比较,这里的问题是您正在 return 索引为 [=] 的系列16=],这会混淆 pandas 并导致矩阵被 return 编辑。如果我们硬编码 'B' 作为示例,您可以看到这一点:

In [75]:
df2.Value[df2.Type == 'B']

Out[75]:
1    1
Name: Value, dtype: int64