Python 熊猫:如何对两个不同数据帧中的值进行条件求和
我有以下数据帧:Python 熊猫:如何对两个不同数据帧中的值进行条件求和,python,pandas,Python,Pandas,我有以下数据帧: 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
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列中的值求和。我试过:
df3 = df1['Leads'] + df2['Leads'].where(df1['Name']==df2['Name'])
返回错误:
ValueError: Can only compare identically-labeled Series objects
我已经研究过StackOverflow上的类似问题,但没有一个适合我的具体用途。有人能给我指出正确的方向吗?让我们试试
merge
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
您可以使用“合并”:
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
,请在求和之前将它们全部作为索引包含进去。假设df2。Name
值是唯一的,df2
有两列作为示例。让我们使用map
和defaultdict
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
我也是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
您可以跨列使用
合并
和求和
:
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
您可以尝试:
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值来使用数据对齐