Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:如何对两个不同数据帧中的值进行条件求和_Python_Pandas - Fatal编程技术网

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值来使用数据对齐