2015-02-09 46 views
3

我希望你能提供一些指导 - 我正在使用Python v2.7中的Pandas库编写脚本。合并数据帧与数组?

该脚本的一部分合并两个数据框 - 一个用于收入,另一个用于性能数据。这些DF都有日常条目,并通过ID列链接。

性能数据框:

 RevID   Date  PartnerName  Performance  Revenue 
    1,2   1/2/2015 Johndoe   0.02    0.00 
    1    2/2/2015 Johndoe   0.12    0.00 
    4    3/2/2015 Johndoe   0.10    0.00 

请注意, '1,2' 上面行中指需要加在一起两个ID

收入数据框:

 RevID  Date  Revenue 
    1   1/2/2015 24000.00 
    2   1/2/2015 25000.00 
    1   2/2/2015 10000.00 
    4   3/2/2015 94000.00 

我的问题是,我怎么能在这两行执行合并考虑到有时候会有一个逗号分隔值(l ike数组)在性能DF中,需要从收入DF中找到两个相应的收入行 - 以及日期。

例如,我将如何处理这一问题,使最终的表格上写着:

 RevID   Date  PartnerName  Performance  Revenue 
    1,2   1/2/2015 Johndoe   0.02    49000.00 
    1    2/2/2015 Johndoe   0.12    10000.00 
    4    3/2/2015 Johndoe   0.10    94000.00 

注意,第一行中的收入已经与REVID 1的值和2 在加在一起这一点,任何帮助将是伟大的!

回答

1

我只想欺骗这个数据,然后用逗号问题消失:

In [11]: res = pd.concat([df.iloc[i] for val, i in g.groups.items() for v in val.split(',')], ignore_index=True) 

In [12]: res['RevID'] = sum([val.split(',') for val in g.groups], []) 

,并确保RevIDs是数字,而不是字符串:

In [13]: res['RevID'] = res['RevID'].convert_objects(convert_numeric=True) 

In [14]: res 
Out[14]: 
    RevID  Date PartnerName Performance Revenue 
0  1 2/2/2015  Johndoe   0.12  0 
1  1 1/2/2015  Johndoe   0.02  0 
2  2 1/2/2015  Johndoe   0.02  0 
3  4 3/2/2015  Johndoe   0.10  0 

这样,你可以合并,你基本上是:

In [21]: res.merge(df2, on=['RevID', 'Date']) 
Out[21]: 
    RevID  Date PartnerName Performance Revenue_x Revenue_y 
0  1 2/2/2015  Johndoe   0.12   0  10000 
1  1 1/2/2015  Johndoe   0.02   0  24000 
2  2 1/2/2015  Johndoe   0.02   0  25000 
3  4 3/2/2015  Johndoe   0.10   0  94000 

注意:您可能要删除0收入列之前合并(然后您不需要指定on)。

如果要引用到一部开拓创新ID(独特的东西),那么你可以说GROUPBY,总结了收入,得到你想要的框架...

+0

谢谢,反正是有避免后缀收入专栏?也就是说:如果那里已经有一列,或者是0或者是另一个数字,只需将新的收入汇总到它上面,而不是重复上面的列? – 2015-02-11 10:18:45

+0

@JonathanKennedy我不太确定,会有一个想法,会做出一个很好的问题(在这里发表,如果你写的话 - 我会upvote!) – 2015-02-11 23:24:54

+0

当然 - http://stackoverflow.com/questions/28479701 /避免-A-后缀柱 - 在合并-代替覆写-任何存在的数据 – 2015-02-12 14:15:00