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
这可能是一个愚蠢的问题,但我已经尝试了一段时间,但似乎无法让它工作。
我有一个数据框:
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