Панды выбирают более высокое значение для каждого уникального идентификатора

у меня есть 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

и счет будет

  • А - 2
  • БИ 2
  • С - 0

Как я смогу это сделать?

df.sort_values(by=['CUST_ID','SEGMENT']).drop_duplicates(sub‌​set='CUST_ID')['SEGM‌​ENT'].value_counts()

Mayur Dhage 06.05.2022 20:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете пойти следующим образом:

(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

Другие вопросы по теме