假设我有两个矩阵,一个原始矩阵和一个参考矩阵:
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添加到第三列,因为表b的列(其中列为col2的行为'c')在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的解决方案。
我不太了解您对要执行的操作的描述,但是可以通过首先合并两个数据帧然后进行一些简单的操作来生成显示的输出。
>>> 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]
如果incol2
中的值b
不是唯一的,则可能还需要类似以下内容:
>>> b.groupby('col2', as_index=False)['col3'].aggregate(sum)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句