Pandas доля значения с условием и добавлением нового столбца - PullRequest
2 голосов
/ 07 апреля 2020

Я новичок в pandas и немного застрял. Можете ли вы мне помочь?

У меня есть датафрейм для хранения заказов:

| item | store_status | customer_status |
|------|--------------|-----------------|
| A    | 'dispatched' | 'received'      |
| A    | 'dispatched' | 'pending'       |
| B    | 'pending'    | 'pending'       |
| B    | 'dispatched' | 'received'      |
| B    | 'dispatched' | 'pending'       |

Я хочу создать новый фрейм данных, который показывает, какая часть каждого элемента «отправлена» и «получена». Таким образом, результат будет:

| item | dispatched_and_received |
|------|-------------------------|
| A    | 0.5                     |
| B    | 0.33                    |

Мне также интересна часть каждого отправляемого элемента, независимо от статуса клиента, и я хочу добавить его в качестве нового столбца в этот фрейм данных:

| item | dispatched_and_received | dispatched |
|------|-------------------------|------------|
| A    | 0.5                     | 1.00       |
| B    | 0.33                    | 0.66       |

Спасибо!

1 Ответ

2 голосов
/ 07 апреля 2020

Создайте логическую серию, которая проверяет условия, а затем выберите среднее значение для этой серии в каждой группе.

(df.assign(dispatched=df.store_status.eq('dispatched'),
           dispatched_and_received=(df.store_status.eq('dispatched')
                                    & df.customer_status.eq('received')))
   .groupby('item')[['dispatched', 'dispatched_and_received']]
   .mean()
   .reset_index())

#  item  dispatched  dispatched_and_received
#0    A    1.000000                 0.500000
#1    B    0.666667                 0.333333

Назначение просто создает столбцы, вы можете разделить их вручную, если все эти цепочки кажутся немного загроможденными. Это эквивалентно:

df['dispatched'] = df.store_status.eq('dispatched')
df['dispatched_and_received'] = df['dispatched'] & df.customer_status.eq('received')

Это фрейм данных после assign

  item store_status customer_status  dispatched  dispatched_and_received
0    A   dispatched        received        True                     True
1    A   dispatched         pending        True                    False
2    B      pending         pending       False                    False
3    B   dispatched        received        True                     True
4    B   dispatched         pending        True                    False
...