#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
andStrawberry
? Каким должен быть результат, когда у anID
есть фрукты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()