Python:如何找到匹配的数据条目并在两个数据集之间执行有效的计算

时间:2018-12-18 21:08:41

标签: python pandas numpy

例如,假设我有两个以Pandas数据框形式存储的数据集,如下所示:

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

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

我想首先在两个熊猫数据帧之间缓存匹配数据条目的索引。这部分不计入我的运行时分析中,因此可以很好地为以后进行更有效的哈希查找而预先进行计算。

例如期望的输出

 {banana: [1]      (banana from Data1 matches with row 1 in Data2)
 apple: [0,2]}     (apple from Data1 matches with row 0 & 2 in Data2)

然后,对于data1中的每一行,我想对找到的所有匹配项的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数据框或numpy? aka使用从计算字典开始的中间步骤来帮助以后提高求和速度。

注意:

第一个任务可以通过

来完成
Data1.reset_index().groupby('C3')['index'].apply(list).loc[Data0.C2.unique()]

第二项任务可以通过

来完成
Data0['W'] = Data0['C2'].map(Data1.set_index('C3', append=True)) \
                        .sum(level=1)['C4']).fillna(0)

但不确定如何利用第一部分中的工作来帮助第二部分进行计算。

1 个答案:

答案 0 :(得分:1)

我认为解决此问题的一种好方法是在groupby上应用sumdata2,然后将所得的Series映射到data1

data1['matches'] = data1.C2.map(data2.groupby('C3')['C4'].sum()).fillna(0)
>>> data1
      C1      C2  matches
0  Peter    kiwi      0.0
1   John  banana      7.0
2  Susan   peach      0.0
3    Joe   apple      8.0