Как найти общую длину значения столбца, имеющего несколько значений в разных строках для другого столбца

#python-3.x #pandas #numpy #dataframe #summary

#python-3.x #pandas #numpy #фрейм данных #Краткие сведения

Вопрос:

Есть ли способ найти идентификаторы, которые имеют как яблоко, так и клубнику, а затем найти общую длину? и идентификаторы, в которых есть только Apple, и идентификаторы, в которых есть только Strawberry?

df:

         ID           Fruit
0       ABC          Apple        <-ABC has Apple and Strawberry
1       ABC          Strawberry   <-ABC has Apple and Strawberry
2       EFG          Apple        <-EFG has Apple only
3       XYZ          Apple        <-XYZ has Apple and Strawberry
4       XYZ          Strawberry   <-XYZ has Apple and Strawberry 
5       CDF          Strawberry   <-CDF has Strawberry
6       AAA          Apple        <-AAA has Apple only
  

Желаемый результат:

 Length of IDs that has Apple and Strawberry: 2
Length of IDs that has Apple only: 2
Length of IDs that has Strawberry: 1
  

Спасибо!

Комментарии:

1. Найти общую длину чего ?

2. Какой ожидаемый результат при изменении EFG на ABC ? тогда групповое ABC совпадение или нет?

3. Я обновил желаемый результат

4. Что делать, если у an ID есть плоды, отличные от Apple and Strawberry ? Каким должен быть результат, когда у an ID есть фрукты Apple Strawberry и некоторые другие фрукты в той же группе?

Ответ №1:

Если всегда все значения только Apple или Strawberry в столбце Fruit , вы можете сравнить наборы по группам, а затем посчитать ID по sum значениям True s:

 v = ['Apple','Strawberry']
out = df.groupby('ID')['Fruit'].apply(lambda x: set(x) == set(v)).sum()
print (out)
2
  

РЕДАКТИРОВАТЬ: если значений много:

 s = df.groupby('ID')['Fruit'].agg(frozenset).value_counts()
print (s)
{Apple}                2
{Strawberry, Apple}    2
{Strawberry}           1
Name: Fruit, dtype: int64
  

Комментарии:

1. Спасибо @jezrael! Я могу просто перейти v на apple или strawberry, если я хочу найти общую длину общих идентификаторов для 1 фрукта?

2. @Mick — yop, нужно только set(x) == set(v)

3. @Mick — Если всегда все значения только Apple или Strawberry в столбце Fruit

4. Что произойдет, если я использую set(x) == set(v) ?

5. @jezrael — редактируемая часть должна быть .agg(frozenset) — это позволяет объектам set быть неизменяемыми.

Ответ №2:

Вы можете использовать pivot_table и value_counts для фреймов данных (Pandas 1.1.0.):

 df.pivot_table(index='ID', columns='Fruit', aggfunc='size', fill_value=0)
.value_counts()
  

Вывод:

 Apple  Strawberry
1      1             2
       0             2
0      1             1
  

В качестве альтернативы вы можете использовать:

 df.groupby(['ID', 'Fruit']).size().unstack('Fruit', fill_value=0)
.value_counts()