我有一些客户交易数据,想删除客户退回产品并获得退款的行。
我有一个称为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/