wjie08:
私はいくつかの顧客取引データを持っており、顧客が製品を返却し、返金を得た行を削除したいと思います。
Iは、(使用済AMT)gross_sales、MEMBER_ID(会員識別)とtrx_date(取引日)、PRODUCT_KEY(製品コード)を含んでデータフレームと呼ばれるTRXを有しています。
私は総売上高(例えば、メンバー22444用21.30)での正の値は、総売上高(例えば、-21.30メンバー22444用)に負の値と一致する一意の各メンバーのためのすべての行を取得したいと思います。これは、製品は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
そこに何かが間違っているが、私のコードであったか、またはこれを行うには良い方法があった場合は、ヘルプの任意のフォームを認める場合には不思議でした、ありがとうございました!
rahlf23:
ここでは、ブールマスクを使用して簡単な方法だと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