使用数组合并数据框?

3

我希望你能提供一些指导 - 我正在使用Python v2.7中的Pandas库编写脚本。

脚本的一部分是合并两个数据框 - 一个用于收入,另一个用于绩效数据。这些数据框都有每天的条目,并通过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

我的问题是,如果Performance DF有一个逗号分隔的值(比如数组),需要从Revenue 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个回答

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(某些唯一的内容),那么您可以按照该ID进行分组并对收入求和,以获得所需的框架...

谢谢,有没有办法避免收入列的后缀?即:如果已经有一个列存在,其中包含0或其他数字,则只需将新收入总和添加到该列中,而不是复制该列。 - Jonathan Kennedy
@JonathanKennedy 我其实不太确定,我会考虑一下的,这会是一个很好的问题(如果你写了的话,在这里发帖,我会点赞的!) - Andy Hayden
当进行合并操作时,如何避免出现后缀列,而是覆盖任何现有数据? - Jonathan Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接