我被困在pandasconcat
和merge
函数之间,努力实现两者的最佳效果。我需要在name和date上对行进行内部联接,对公共列A和B求和,并保留category中的值(如果需要,我可以将其添加到联接中,它们匹配)
示例-
df1
| name | date | A | B | category |
|------|----------|---|---|----------|
| W | 1/1/2020 | 1 | 1 | home |
| W | 1/2/2020 | 1 | 1 | home |
| Y | 1/3/2020 | 1 | 1 | garden |
| Y | 1/4/2020 | 1 | 1 | garden |
df2
| name | date | A | B | category |
|------|----------|---|---|----------|
| W | 1/1/2020 | 2 | 2 | home |
| W | 1/2/2020 | 1 | 1 | home |
| Y | 1/3/2020 | 1 | 1 | garden |
| Y | 1/5/2020 | 1 | 1 | garden |
期望结果-
| name | date | A | B | category |
|------|----------|---|---|----------|
| W | 1/1/2020 | 3 | 3 | home |
| W | 1/2/2020 | 2 | 2 | home |
| Y | 1/3/2020 | 2 | 2 | garden |
我发现merge
将连接行,但复制未连接的任何列,而不是对它们求和
concat
将对行求和,但不进行内部联接,因此我只从一个数据帧或另一个数据帧获取数据行。我试过pd.concat([df_1, df_2], join='inner'
,但“内部”并不能满足我的需要
这个怎么样:
输出:
这就是你想要的
我会在
name
、date
和category
上使用groupby,并使用sum
聚合(在A
和B
上求和)。但这会提供额外的列,因为日期为1/4/2020
和1/5/2020
的行不会消失,而是总和为1代码如下:
这将为您提供:
然后,如果不想看到sum=1的行,可以对
A
或/和B
的值进行筛选希望这有帮助
第一个“幼稚”解决方案:
更好的解决方案,无需手动添加列:
结果:
使用
pd.merge
可以指定组合键["name","date","category"]
连接2个数据帧相关问题 更多 >
编程相关推荐