2016-10-07 18 views
1

这可能是一个愚蠢的问题,但我一直在尝试一段时间,我似乎无法让它工作。熊猫应用返回矩阵而不是单列

我有一个数据帧:

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

您可以使用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) 

这是试图比较'类型'和返回'价值'这里的问题是你要返回一个索引为df2的系列,这是令人困惑的熊猫,并导致矩阵返回。你可以看到这个,如果我们硬代码'B'为例:

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

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

完美,非常感谢! – petetheat

+0

完成!再次感谢 – petetheat