微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 仅当行和列值相同时才添加两个pandas数据帧值

我有两个不同大小的数据帧,其中一个比另一个大,但第二个数据帧有更多列.

如果它具有相同的列和放大器,我在尝试添加数据帧时遇到问题.行值作为另一个数据帧,在这种情况下是id

这是一些虚拟数据以及我是如何尝试解决它的

import pandas as pd

df1 = pd.DataFrame([(1,2,3),(3,4,5),(5,6,7),(7,8,9),(100,10,12),(100,10,12),(100,10,12)], columns=['id','value','c'])
df2 = pd.DataFrame([(1,200,3,4,6),(3,400,3,4,6),(5,600,3,4,6),(5,620,3,4,6)], columns=['id','value','x','y','z'])

因此,如果df1和df2的id相同,则将列值添加“whatToAdd”中的值

数据

df1: 
         id    value    c     
         1     2        3     
         3     4        5     
         5     6        7
         7     8        9     
         100   10       12    
         100   10       12
         100   10       12
df2: 
         id    value    x     y    z
         1     200      3     4    6
         3     400      3     4    6
         5     600      3     4    6
         5     620      3     4    6 

预期:

  Out: 
     id    value    x     y    z
     1     202      3     4    6
     3     404      3     4    6
     5     606      3     4    6
     5     626      3     4    6 

尝试:

for each in df1.a:
    if(df2.loc[df2['a'] == each]):
        df2['a']+=df['a']

发出错误“DataFrame的真值是不明确的.使用a.empty,a.bool(),a.item(),a.any()或a.all().”这让我感到困惑,因为我试过:

df2.loc[df2['a']==1

离开循环,它的工作原理

解决方法:

将两个数据帧设置为具有相同的索引后:

df1 = df1.set_index("id")
df2 = df2.set_index("id")

你可以做一个非常简单的操作:

mask = df1.index.isin(df2.index)
df2["value"] += df1.loc[mask, "value"]

输出

    value   x   y   z
id              
1   202     3   4   6
3   404     3   4   6
5   606     3   4   6
5   626     3   4   6

您可以随时执行df2.reset_index()以恢复原始设置.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐