检查数据框的值是否存在于另一个中,并以特定方式设置值以解决重复

托马斯·阿里亚斯(Tomas Arias)

我有两个数据框

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何检查值是否存在于另一个熊猫数据框中?

检查值是否存在于选择查询中的另一个表中

检查一个数据框是否存在于另一个

检查数据框中的 ID 是否存在于另一个数据框中的最快方法

检查一个数据框中的值是否存在于另一数据框中,打印所有对值

检查数组值是否存在于另一个包含逗号分隔值的数组值中

检查一个数据集中的特定值范围是否存在于另一个数据集中

检查一个表中的值组合是否存在于另一个表中

如何根据值是否存在于另一个数据框中从数据框中删除值?

检查所有数组值是否存在于另一个数组值中

熊猫检查行是否存在于另一个数据框中并追加索引

如何检查 csv 文件中的值是否存在于另一个文件中

检查对象值数组是否存在于另一个数组中,但长度不同

如何检查嵌套对象的值是否已存在于另一个对象中?

检查数据帧中的值是否存在于具有条件的另一个数据帧中

Pandas 数据框检查一个值是否存在于一行的多列中

如何使用SQL检查一个表中存在的json值数组是否存在于另一个表中?

Spark(scala)数据框-检查列中的字符串是否存在于另一个数据框的列中

如果另一列的值存在于另一个数据框中,则将值插入列中

检查一个数组列表中的值是否存在于另一个数组列表中

如何检查一个JavaScript对象中的值是否存在于另一个JavaScript对象中?

蜂巢:如何检查一个数组中的值是否存在于另一个数组中?

如果条件检查一个列表的所有值是否存在于另一个列表中

查看一个数据帧行中的所有值是否存在于另一个数据帧中

熊猫从第二个数据框中选择的列,其中另一个列的值存在于主数据框中

SQL查询检查值基于另一个列值存在于查找中

如何检查一个数据集中的字符串是否存在于另一个数据集中,并在R中添加缺少的值?

检查键是否存在于另一个对象中

如何检查对象属性是否也存在于另一个对象中?