Pandas或Numpy:如何获得匹配的数据条目来进行数据操作

2024-04-26 06:49:28 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我有两个数据关系,如下所示:

Data1:
   C1      C2
"Peter"  "kiwi"
"John"   "banana"
"Susan"  "peach"
"Joe"    "apple"

Data2:
   C3      C4
"apple"     4 
"banana"    7
"apple"     4

对于data1中的每一行,我想找到公共属性上所有可能的匹配项(比如data1[C2]和Data2[C3]之间的匹配项),并对找到的所有匹配项的Data2[C4]值求和。你知道吗

更具体地说,我希望得到的计算结果如下:

"Peter":  0 (no match for "kiwi")
"John":   7 (one match for "banana", it's just 7)
"Susan":  0 (no match for "peach")
"Joe":    8 (two matches for "apple", they're 4+4)

如何使用pandas dataframe或numpy高效地实现这一点?你知道吗

非常感谢你的帮助。在我得到更多关于这个问题的技术细节的信息后,我将编辑这个问题的标题,使之更相关。你知道吗


Tags: appleformatchjohnpeterbananac2joe
1条回答
网友
1楼 · 发布于 2024-04-26 06:49:28

一种方法是使用mergegroupby:

data1.merge(data2, left_on='C2', right_on='C3', how='left')[['C1', 'C4']]\
     .fillna(0)\
     .groupby('C1')\
     .sum()

输出:

        C1   C4
0    "Joe"  8.0
1   "John"  7.0
2  "Peter"  0.0
3  "Susan"  0.0

要获取字典输出:

data1.merge(data2, left_on='C2', right_on='C3', how='left')[['C1', 'C4']]\
     .fillna(0)\
     .groupby('C1')\
     .sum()\
     .T\
     .to_dict('r')

输出:

[{'"Joe"': 8.0, '"John"': 7.0, '"Peter"': 0.0, '"Susan"': 0.0}]

另一种方法是将mapsum:

data1['Score'] = data1['C2'].map(data2.set_index('C3', append=True)\
                            .sum(level=1)['C4']).fillna(0)
data1[['C1', 'Score']]

输出:

        C1  Score
0  "Peter"    0.0
1   "John"    7.0
2  "Susan"    0.0
3    "Joe"    8.0

附加评论:

data1.merge(data2.rename_axis('d2_idx').reset_index(), left_on='C2', right_on='C3', how='left')\
     .groupby('C1')['d2_idx','C4']\
     .agg({'d2_idx':lambda x: ', '.join(x.astype(str)), 'C4':'sum'})

输出:

           d2_idx   C4
C1                    
"Joe"    0.0, 2.0  8.0
"John"        1.0  7.0
"Peter"       nan  0.0
"Susan"       nan  0.0

相关问题 更多 >