例如,假设我有两个以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)
但不确定如何利用第一部分中的工作来帮助第二部分进行计算。
答案 0 :(得分:1)
我认为解决此问题的一种好方法是在groupby
上应用sum
和data2
,然后将所得的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