python - 在 Pandas 列中寻找与负值匹配的正值

标签 python pandas dataframe pandas-groupby

我有一些客户交易数据,想删除客户退回产品并获得退款的行。

我有一个称为trx的数据框,其中包含product_key(产品代码),gross_sales(花费的金额),member_id(成员标识)和trx_date(交易日期)。

我想获得每个唯一成员的所有行,其中总销售额中的正值(例如,对于成员22444为21.30)与总销售额中的负值(例如,对于成员22444为-21.30)。这将使我确定产品是否在14天内退款。

我尝试了以下代码,但编译时间太长。

product key     gross_sales      member_id      trx_date
1001            14.50            10024          20-12-2018
1001            14.50            10024          20-12-2018 
1002            21.30            22444          10-10-2018
1003            11.10            516            05-10-2018
1002           -21.30            22444          23-10-2018
1005            5.50             1800           01-09-2018
1006            8.30             4221           01-09-2018
1003           -11.10            516            06-10-2018


neg_gross_sales = trx.gross_sales[trx.gross_sales < 0]
pos_gross_sales = trx.gross_sales[trx.gross_sales > 0]

matching_vals = []

for i in trx['member_id'].unique():
    for j in trx['gross_sales']:
        if j in abs(neg_gross_sales):
            if j in abs(pos_gross_sales):
                matching_vals.append(j)
            else:
                continue
        else:
            continue
print (matching_vals)

我希望我的输出看起来像这样
product key     gross_sales      member_id      trx_date
1002            21.30            22444          10-10-2018
1002           -21.30            22444          23-10-2018
1003            11.10            516            05-10-2018
1003           -11.10            516            06-10-2018

想知道我的代码是否有问题,或者是否有更好的方法来执行此操作,感谢任何形式的帮助,谢谢!

最佳答案

这是使用 bool(boolean) 掩码和transform()的简单方法:

df[df.groupby(['member_id','product key'])['gross_sales'].transform('sum').eq(0)]

产量:
   product key  gross_sales  member_id   trx_date
2         1002         21.3      22444 2018-10-10
3         1003         11.1        516 2018-05-10
4         1002        -21.3      22444 2018-10-23
7         1003        -11.1        516 2018-06-10

然后,您可以在此处应用14天退货政策窗口。可能是这样的(假设您的trx_date列是datetime -type):
df[df.groupby(['member_id','product key'])['trx_date'].diff().dt.days.lt(14)]

产量:
   product key  gross_sales  member_id   trx_date
4         1002        -21.3      22444 2018-10-23

关于python - 在 Pandas 列中寻找与负值匹配的正值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60558920/

相关文章:

python - 为什么我的可选组不是贪心的?/(5)?.*/

python - 将 C 应用程序与 Python GUI 结合使用

python - 通过使用 pandas 对列进行分组来汇总数据框

python - 将 .txt 数据分组到数据框中

python - 删除python中pandas中重复标题或字符串相同列和空行的行

python - 代码在命令提示符下逐行运行,但是当我整体运行文件时出现新问题

python - __unicode__() 不返回字符串

python - 在训练上拆分并按组分离测试

python - 将函数应用于一系列特定行

python - 根据另一个 pandas 数据框中的列的排序对列进行排序