2014-03-05 80 views
2

說我有兩個矩陣,原始和參考值的熊貓數據幀的一列:值添加到基於另一個

import pandas as pa 
print "Original Data Frame" 
# Create a dataframe 
oldcols = {'col1':['a','a','b','b'], 'col2':['c','d','c','d'], 'col3':[1,2,3,4]} 
a = pa.DataFrame(oldcols) 
print "Original Table:" 
print a 

print "Reference Table:" 
b = pa.DataFrame({'col1':['x','x'], 'col2':['c','d'], 'col3':[10,20]}) 
print b 

凡表是這樣的:

Original Data Frame 
Original Table: 
    col1 col2 col3 
0 a c  1 
1 a d  2 
2 b c  3 
3 b d  4 

Reference Table: 
    col1 col2 col3 
0 x c 10 
1 x d 20 

現在我想從原始表(a)的第三列(col3)中減去兩個表中第二列匹配的行中參考表(c)中的值。因此,表2的第一行應該將值10添加到第三列,因爲列col2爲'c'的表b的行在col3中具有值10。合理?下面是一些代碼,做的是:

col3 = [] 
for ix, row in a.iterrows(): 
    col3 += [row[2] + b[b['col2'] == row[1]]['col3']] 

a['col3'] = col3 
print "Output Table:" 
print a 

得到以下的輸出:

Output Table: 
    col1 col2 col3 
0 a c [11] 
1 a d [22] 
2 b c [13] 
3 b d [24] 

我的問題是,是否有一個更優雅的方式來做到這一點?此外,'col3'中的結果不應該是列表。使用numpy的解決方案也受到歡迎。

回答

1

我並不完全理解你對你要做什麼的描述,但是你已經顯示的輸出可以通過首先合併兩個數據框然後進行一些簡單的操作來生成;

>>> df = a.merge(b.filter(['col2', 'col3']), how='left', 
       left_on='col2', right_on='col2', suffixes=('', '_')) 
>>> df 
    col1 col2 col3 col3_ 
0 a c  1  10 
1 b c  3  10 
2 a d  2  20 
3 b d  4  20 

[4 rows x 4 columns] 
>>> df.col3_.fillna(0, inplace=True) # in case there are no matches 
>>> df.col3 += df.col3_ 
>>> df 
    col1 col2 col3 col3_ 
0 a c 11  10 
1 b c 13  10 
2 a d 22  20 
3 b d 24  20 

[4 rows x 4 columns] 
>>> df.drop('col3_', axis=1, inplace=True) 
>>> df 
    col1 col2 col3 
0 a c 11 
1 b c 13 
2 a d 22 
3 b d 24 

[4 rows x 3 columns] 

如果bcol2不是唯一的,那麼很可能你也需要這樣的東西:

>>> b.groupby('col2', as_index=False)['col3'].aggregate(sum) 
+0

是啊,那是相當多正是我試圖做的! –

相關問題