2016-10-07 28 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