Pandas Apply返回矩阵而不是单列

时间:2016-10-07 06:49:47

标签: python pandas apply

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

我有一个数据框:

   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]})

我用作查找表。

当我尝试类似的事情时:

    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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可以使用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'并返回'value'这里的问题是你返回的索引为df2的系列,这会让pandas感到困惑并导致返回矩阵。如果我们硬编码'B'作为例子,你可以看到这个:

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

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