Поиск положительных значений, которые соответствуют отрицательным значениям в столбце Pandas - PullRequest
2 голосов
/ 06 марта 2020

У меня есть некоторые данные транзакции клиента, и я хотел бы удалить строки, в которых клиент возвратил продукт и получил возмещение.

У меня есть фрейм данных с именем trx, который содержит product_key (код продукта), gross_sales ( потрачено), member_id (идентификация участника) и trx_date (дата транзакции).

Я хотел бы получить все строки для каждого уникального члена, где положительное значение в валовых продажах (например, 21,30 для члена 22444 ) соответствует отрицательному значению в валовых продажах (например, -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

Интересно, что-то не так с моим кодом или есть лучший способ сделать это, благодарю за любую помощь, спасибо!

Ответы [ 3 ]

6 голосов
/ 06 марта 2020

Вот простой способ с использованием логической маски и 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):

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
2 голосов
/ 06 марта 2020

В одну сторону, используя any с numpy.isclose:

refunded_member = df.groupby("member_id")["gross_sales"].apply(lambda x: any(np.isclose(-i, x).any() for i in x))
new_df = df.set_index('member_id')[refunded_member].reset_index()
print(new_df)

Вывод:

   member_id  product_key  gross_sales    trx_date
0      22444         1002         21.3  10-10-2018
1        516         1003         11.1  05-10-2018
2      22444         1002        -21.3  23-10-2018
3        516         1003        -11.1  06-10-2018
1 голос
/ 06 марта 2020

Еще один подход

a=  df.loc[df['gross_sales'].le(0)]
b = df.loc[(df.gross_sales.isin(abs(a.gross_sales))) & (df.member_id.isin(a.member_id))]
a.append(b)

вывод

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