Pandas:基于多级第一次出现合并数据框架

4
我正在尝试基于一对标准(月份数字)的第一次出现将一个大数据框与一个小数据框合并。
我已经拼凑出可行的代码(实际/期望输出在底部),但它似乎可以更加高效。
我的问题是-我是否错过了更简单的方法来做到这一点?
设置:
import pandas as pd

m = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2]
n = [1,1,1,20,20,300,300,20,20,1,1,1,20,300,20,1,1,1,20,20,300,300,300,20,20,1,1]
df = pd.DataFrame({'month':m, 'num':n, 'x':0})

m2 = [1,1,1,2,2,2]
n2 = [1,20,300,1,20,300]
s2 = [11,222,3333,44,555,6666]
df2 = pd.DataFrame({'month':m2, 'num':n2, 'sum':s2})

当前代码:

dfx = pd.DataFrame(df.groupby(['month','num'])['x'].idxmax())
dfx.rename(columns = {'x':'find'}, inplace = True)

df2.set_index(['month','num'], inplace = True)
df2 = pd.merge(df2, dfx, left_index = True, right_index = True)

df = df.merge(df2, left_index = True, right_on = 'find', how = 'left')
df = df.drop(['find','x'], axis = 1).reset_index(drop = True).fillna(0)

输出:

    month  num     sum
0       1    1    11.0
1       1    1     0.0
2       1    1     0.0
3       1   20   222.0
4       1   20     0.0
5       1  300  3333.0
6       1  300     0.0
7       1   20     0.0
8       1   20     0.0
9       1    1     0.0
10      1    1     0.0
11      1    1     0.0
12      1   20     0.0
13      1  300     0.0
14      1   20     0.0
15      1    1     0.0
16      2    1    44.0
17      2    1     0.0
18      2   20   555.0
19      2   20     0.0
20      2  300  6666.0
21      2  300     0.0
22      2  300     0.0
23      2   20     0.0
24      2   20     0.0
25      2    1     0.0
26      2    1     0.0
1个回答

7

如果我理解正确,你可以在两个数据框之间进行常规的 merge,然后结合 locduplicated 来清除非第一次出现的内容:

df3 = df.merge(df2, how='left', on=['month', 'num'])
df3.loc[df3.duplicated(subset=['month', 'num']), 'sum'] = 0

生成的输出:

   month  num   sum
0       1    1    11
1       1    1     0
2       1    1     0
3       1   20   222
4       1   20     0
5       1  300  3333
6       1  300     0
7       1   20     0
8       1   20     0
9       1    1     0
10      1    1     0
11      1    1     0
12      1   20     0
13      1  300     0
14      1   20     0
15      1    1     0
16      2    1    44
17      2    1     0
18      2   20   555
19      2   20     0
20      2  300  6666
21      2  300     0
22      2  300     0
23      2   20     0
24      2   20     0
25      2    1     0
26      2    1     0

非常好!我现在可以继续了 :-) - piRSquared
啊,因为.duplicated默认情况下会保留第一次出现的值。真是个天才设计。谢谢! - elPastor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接