у меня есть df клиентов
CUST_ID | SEGMENT | AREA
1 | B | CAD
1 | A | RAM
2 | B | CAD
2 | C | RAM
3 | B | RAM
4 | A | RAM
Я хочу подсчитать уникальное число CUST_ID
за SEGMENT
, поэтому я сделал
df.groupby(['SEGMENT'])['CUST_ID'].nunique()
Однако, если есть одинаковые CUST_ID
с разными типами SEGMENT
, то число на SEGMENT
увеличивается. Я хочу выбрать наибольшее значение SEGMENT
за CUST_ID
, а затем подсчитать. А — самый высокий, а С — самый низкий. Таким образом, результирующий df будет выглядеть так:
CUST_ID | SEGMENT | AREA
1 | A | RAM
2 | B | CAD
3 | B | RAM
4 | A | RAM
и счет будет
Как я смогу это сделать?
Вы можете пойти следующим образом:
(df.sort_values('SEGMENT').drop_duplicates('CUST_ID') # remove duplicates, keep only first 'CUST_ID'
.groupby('SEGMENT')['CUST_ID'].nunique() # or just `.size()` because there are no duplicates
)
Вы можете попробовать сгруппировать столбец CUST_ID
, а затем отфильтровать строки, получив значение min
столбца SEGMENT
.
out = (df.groupby(['CUST_ID'])
.apply(lambda g: g[g['SEGMENT'].eq(g['SEGMENT'].min())])
.reset_index(drop=True))
ПРИМЕЧАНИЕ. Поскольку вы хотите выбрать СЕГМЕНТ с наибольшим значением для CUST_ID, а затем подсчитать, А является самым высоким, а С — самым низким, в таблице ASCII A
равно 65, C
равно 67. При сравнении A на самом деле меньше, чем C. Это зачем использовать min
здесь.
print(out)
CUST_ID SEGMENT AREA
0 1 A RAM
1 2 B CAD
2 3 B RAM
3 4 A RAM
res = out.value_counts('SEGMENT')
print(res)
A 2
B 2
Name: SEGMENT, dtype: int64
df.sort_values(by=['CUST_ID','SEGMENT']).drop_duplicates(subset='CUST_ID')['SEGMENT'].value_counts()