Pandas: 如何在两个不同的数据框中有条件地对值进行求和

3

我有以下数据框:

df1
    Name        Leads
0   City0       22
1   City1       11
2   City2       28
3   City3       15
4   City4       14
5   City5       15
6   City6       25

df2
    Name        Leads
0   City1       13
1   City2       0
2   City4       2
3   City6       5

我希望能够总结“Leads”列中的值,但仅当“Name”列中的值匹配时才进行。我已尝试过:
df3 = df1['Leads'] + df2['Leads'].where(df1['Name']==df2['Name'])

出现错误:

ValueError: Can only compare identically-labeled Series objects

我浏览了StackOverflow上类似的问题,但没有符合我的具体使用情况。有人能指点一下我吗?

6个回答

1
假设 df2.Name 的值是唯一的,且 df2 与您示例中完全相同,只有两列。让我们尝试使用 mapdefaultdict 来做些不同的事情。
from collections import defaultdict

df1.Leads + df1.Name.map(defaultdict(int, df2.to_numpy()))

Out[38]:
0    22
1    24
2    28
3    15
4    16
5    15
6    30
dtype: int64

0

让我们尝试合并

df = df1.merge(df2,on='Name', how='left')
df['Leads']=df['Leads_x'].add(df['Leads_y'],fill_value=0)
df
Out[9]: 
    Name  Leads_x  Leads_y  Leads
0  City0       22      NaN   22.0
1  City1       11     13.0   24.0
2  City2       28      0.0   28.0
3  City3       15      NaN   15.0
4  City4       14      2.0   16.0
5  City5       15      NaN   15.0
6  City6       25      5.0   30.0

0
你可以使用mergesum在列之间进行操作:
df1['Leads'] = df1.merge(df2, on='Name', how='outer').filter(like='Lead').sum(1)

    Name    Leads
0   City0   22.0
1   City1   24.0
2   City2   28.0
3   City3   15.0
4   City4   16.0
5   City5   15.0
6   City6   30.0

0

你可以使用合并:

df1.merge(df2,how='left',on=['Name']).set_index(['Name']).sum(1).reset_index()

输出:

    Name     0
0  City0  22.0
1  City1  24.0
2  City2  28.0
3  City3  15.0
4  City4  16.0
5  City5  15.0
6  City6  30.0

如果你只想要匹配的元素,可以删除how参数,从而得到以下输出:

    Name   0
0  City1  24
1  City2  28
2  City4  16
3  City6  30

如果您的实际情况中除了Name之外还有更多列不想进行求和,那么请在求和之前将它们全部作为索引包含进来。


0

我也是Python的新手。我相信有人可以用更好的方法解决它。以下解决方案在我尝试过后在我的系统上以某种方式起作用。你也可以试试。

for i in df2.Name:
    temp = df1[df1.Name==i].Leads.sum() + df2[df2.Name==i].Leads.sum()
    df1.loc[df1.Name ==i, 'Leads'] = temp

0

你可以尝试:

df1.set_index('Name').add(df2.set_index('Name')).dropna().reset_index()

输出:

    Name  Leads
0  City1   24.0
1  City2   28.0
2  City4   16.0
3  City6   30.0

通过在数据框上设置索引并从df2中删除索引不匹配的nan值,使用数据对齐。


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