我有两个数据框
在df1中,我将一个ID分配给了一个人,每个人最多可以有2个ID:
df1
id1 id2
2040 0
2041 2050
2042 0
2043 0
2044 2051
2045 2052
在df2中,我得到了这些人的付款和身份证清单,但没有安排:
df2
id amount
2040 10
2040 10
2053 5
2043 5
2052 10
2045 5
我正在寻找的是一种创建df3的方法,该方法以df1的特定顺序组织付款,同时考虑到一个人多次付款的可能性:示例:
df3
id1 id2 payment
2040 0 20
2041 2050 0
2042 0 0
2043 0 5
2044 2051 0
2045 2052 15
和df4(如果df2中存在不存在于df1中的任何ID,以供将来更正)
df4
id amount
2053 5
提前致谢。
Dataframe.replace
df3 = df1.assign(payment=df1.replace(df2.groupby('id')['amount'].sum())
.where(df1.isin(df2['id'].tolist()))
.sum(axis=1))
%%timeit
df3 = df1.assign(payment=df1.replace(df2.groupby('id')['amount'].sum())
.where(df1.isin(df2['id'].tolist())).sum(axis=1))
4.37 ms ± 500 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
df3 = df1.assign(payment=df1.reset_index().melt('index')
.assign(value=lambda x: x.value.map(df2.groupby('id')['amount']
.sum()))
.groupby('index')['value'].sum())
8.83 ms ± 1.95 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
我喜欢使用,DataFrame.melt
因为我们不依赖于中的列数df1
df3 = df1.assign(payment=df1.reset_index().melt('index')
.assign(value=lambda x: x.value.map(df2.groupby('id')
.amount
.sum()))
.groupby('index')['value'].sum())
print(df3)
id1 id2 payment
0 2040 0 20.0
1 2041 2050 0.0
2 2042 0 0.0
3 2043 0 5.0
4 2044 2051 0.0
5 2045 2052 15.0
和df4:
df4 = df2.merge(df1.melt(),
left_on='id',
right_on='value',
indicator=True,
how='left')\
.loc[lambda x: x._merge=='left_only', df2.columns]
print(df4)
id amount
2 2053 5
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句