Зацикливание на выводе groupby Pandas при группировке по нескольким столбцам и отсутствующим данным - PullRequest
0 голосов
/ 27 мая 2020

Группировка по нескольким столбцам с отсутствующими данными:

data = [['Falcon', 'Captive', 390], ['Falcon', None, 350],
        ['Parrot', 'Captive', 30], ['Parrot', 'Wild', 20]]
df = pd.DataFrame(data, columns = ['Animal', 'Type', 'Max Speed'])

Я понимаю, как обрабатываются отсутствующие данные при группировке по отдельным столбцам ( столбцы группировки с NaN (отсутствующими) значениями ), но не понимаю поведения при группировке по двум столбцам.

Кажется, я не могу oop по всем группам, даже если они кажутся идентифицированными:

groupeddf = df.groupby(['Animal', 'Type'])
counter = 0
for group in groupeddf:
    counter = counter + 1
print(counter)
len(groupeddf.groups)

приводит к 3 и 4 что несовместимо.

Pandas версия 1.0.3

Ответы [ 2 ]

1 голос
/ 27 мая 2020

В посте о столбцах groupby с NaN (пропущенными) значениями есть предложение: Группы NA в GroupBy автоматически исключаются .

Видимо, в случае группировки по нескольким столбцам, то же самое происходит, если любой уровень ключа группировки содержит NaN .

Чтобы подтвердить это, запустите:

for key, grp in groupeddf:
    print(f'\nGroup: {key}\n{grp}')

, и результат будет:

Group: ('Falcon', 'Captive')
   Animal     Type  Max Speed
0  Falcon  Captive        390

Group: ('Parrot', 'Captive')
   Animal     Type  Max Speed
2  Parrot  Captive         30

Group: ('Parrot', 'Wild')
   Animal  Type  Max Speed
3  Parrot  Wild         20

Но если вы выполните groupeddf.groups (для печати содержимого), вы получите:

{('Falcon', 'Captive'): Int64Index([0], dtype='int64'),
 ('Falcon', nan): Int64Index([1], dtype='int64'),
 ('Parrot', 'Captive'): Int64Index([2], dtype='int64'),
 ('Parrot', 'Wild'): Int64Index([3], dtype='int64')}

Итак, у нас есть группа ('Falcon', nan) , содержащая строку с индексом 1 .

Если вы хотите обработать все групп, без каких-либо уловок для изменения NaN на что-то другое, запустите что-то вроде:

for key in groupeddf.groups:
    print(f'\nGroup: {key}\n{df.loc[groupeddf.groups[key]]}')

На этот раз распечатка будет содержать также ранее отсутствующую группу.

1 голос
/ 27 мая 2020

To l oop по всем группам в pandas 1.0 вам нужно будет преобразовать объекты NoneType в строки.

df = df.astype(str) # or just df['Type'] = df['Type'].astype(str) 

Тогда вы получите четыре итерации вашего l oop.

Согласно docs :

NA и обработка групп NaT

Если есть Значения NaN или NaT в ключе группировки будут автоматически исключены. Другими словами, никогда не будет «группы NA» или «группы NaT». Этого не было в более старых версиях pandas, но пользователи, как правило, отказывались от группы NA (и поддержка ее была головной болью реализации).

Или вы могли перейти на dev pandas 1.1, где эта проблема решается с помощью опции dropna=False

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...