这可能是一个愚蠢的问题,但我已经尝试了一段时间,我似乎无法让它发挥作用。
我有一个数据框:
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
我做错了什么?
答案 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