【问题标题】:matching pairs of positive and negative numbers for every id为每个 id 匹配正负数对
【发布时间】:2021-11-15 21:47:18
【问题描述】:

我有下面的数据框:

import pandas as pd
d = {'id': [1,1,2,2,3,3,3,4,4],
    'amount':[2,3,5,-5,2,3,-5,3,4]}

d = pd.DataFrame(d)
d
   id   amount
0   1   2
1   1   3
2   2   5
3   2   -5
4   2   4
5   2   6
6   3   2
7   3   3
8   3   -5
9   4   3
10  4   4
11  4   100
12  4   -100

所以我想要做的是将每个 id 的正值与负值匹配,然后我这样做:

d[d.groupby(['id'])['amount'].transform('sum').eq(0)

这给了我这个输出:


   id   amount
2   2   5
3   2   -5
4   3   2
5   3   3
6   3   -5

如您所见,我的代码不仅可以匹配我想要的行对。例如,对于 id 3,它在我设置的条件下匹配三行。我怎样才能让它只匹配成对的行并获得所需的输出如下:

   id   amount
2   2   5
3   2  -5
11  4   100
12  4  -100

【问题讨论】:

    标签: python python-3.x pandas dataframe dictionary


    【解决方案1】:

    一种方法是检查元素的负数是否存在于它自己的组中:

    def refunded(data):
        return data[data["amount"].isin(-data["amount"])]
    
        new_df = df.groupby("id").apply(refunded).reset_index(0, drop=True)
    print(new_df)
    

    输出:

        id  amount
    2    2       5
    3    2      -5
    11   4     100
    12   4    -100
    

    【讨论】:

    • 谢谢。所以我有一个包含交易('amount')和用户('id)的数据框,我想检查正面交易是否与负面交易匹配(基本上我想找到退款的交易)。我在完整的数据帧上运行了您的代码,但它错过了很多所需的交易。
    • 我相信它错过了超过 2 行的那些?如果您可以更新问题中的示例以提供示例,那就更好了;)。我猜lensum 邀请了太多的比赛条件(例如[5, 5, -5, -5]
    • 感谢您的评论。我更新了示例 df 和我想要的输出。每个 user_id 可以有两个以上的行事务。
    • @Unicorn07 你能检查我的更新吗?
    猜你喜欢
    • 2010-10-14
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多