使用日期和另一列在Pandas中合并两个列。

3

你好,尝试合并两个数据框,并按日期和upc总计访问次数。

  1. 交易数据(日期、upc、销售额)200k行x 3列
  2. 访问次数(日期、upc、访问次数)超过200万行x 3列

我已经尝试过这个:

df3 = pandas.merge(df1,df2, on = ['upc','date'], how = 'left') 

结果:合并执行了,但没有按日期或upc求和。
我还尝试过:
df3 = pandas.merge(df1,df2, left_on = ['date'], right_on ['upc'] how = 'left')

但那并没有起作用。

df3 = pandas.merge(df1,df2, left_on = ['date','upc'], right_on ['date','upc'] how = 'left')

我尝试了一种方法,但是不起作用。

我还尝试了

df3 = pandas.merge(df1,df2, on = ['date'], how = 'left')

我不断收到一个错误消息。根据错误消息,看起来我需要将数据帧中的一个日期转换为pandas dtype。

我进行了更改并返回了与第一次尝试相同的结果。合并成功了,但没有对结果进行求和。我尝试将两个数据帧中的日期都转换为astype(str),但没有成功。我发现如果两个日期具有相同的日期格式dtype或astype(str),则会返回内存错误消息。合并失败了。

我成功地使用upc进行合并,但这在我的数据中创建了一个问题,因为由于日期列,upc重复出现在交易中,导致访问编号重复。

最终我需要类似于Excel中的sumif函数的东西。

我需要通过总结每天每个upc的总访问量来组合这两个数据集,并保持交易数据不变或按照sql的左连接。

示例数据

df1
  Date         upc       sales
0 09/01/2016   A01234    1000
1 09/02/2016   A01234    500
2 09/10/2016   A56789    1200

df2
  Date         upc         visits
0 09/01/2016   A01234      10
1 09/02/2016   A01234      25
2 09/05/2016   A56789      26
3 09/10/2016   A56789      32


df3
  Date         upc       sales   visits
0 09/01/2016   A01234    1000    10
1 09/02/2016   A01234    500     25
2 09/10/2016   A56789    1200    32

想知道pandasql包是否是我需要使用的。任何帮助都将不胜感激。


1
一个简单的 df1.merge(df2, on=['Date', 'upc']) 就可以了,不是吗? - cs95
1个回答

4
您执行的第一个合并语句应该能够让您完成一半的工作,但不幸的是,它只是两步操作中的第二步。听起来您想在按日期/ upc汇总访问数据之后将销售数据合并到访问数据上。实际上,您需要先进行求和(merge命令本身不会这样做)。请尝试以下操作:
df2_sum = df2.groupby(["Date", "upc"])["visits"].sum().reset_index()

然后将其左合并到销售数据中:
df3 = pd.merge(df1, df2_sum, on=["Date", "upc"], how="left")

访问数据已经被汇总了。这是来自Big Query的一个查询,输出每天和每个UPC的访问计数。使用groupby会如何改变格式? - Hobes
嗨PaSTE,我尝试了第二种方法,脚本运行了,但输出不成功。访问列合并了,但该列为空。没有任何值。 - Hobes
所以我通过使用pandasql找到了一个解决方案。使用group by子句组合数据并对值进行求和是可行的。 - Hobes
本意是添加更多的注释,问题出在日期上。不太确定原因,但当你将两个数据框的日期都转换为Pandas日期时间并使用Pandasql进行合并时,合并就可以正常工作,并且访问量的值也会被汇总。唯一的限制是输出,在表格合并后,日期字段显示的是00:00:00的日期和时间戳。Excel很容易将其转换为日期。只是想注意一下,并看看是否有人知道如何操作日期,使它们以简单的日期格式输出,例如09/02/2016。 - Hobes

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