当按多列和缺失的数据进行分组时,在Pandas的groupby输出上进行循环。

问题描述 投票:0回答:1

按多列分组,数据缺失。

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

我了解在按单列分组时如何处理缺失的数据(分组比列的NaN(缺失)值),但不理解按两列分组时的行为。

我似乎不能循环处理所有的组,即使它们似乎被识别。

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版本

python pandas pandas-groupby
1个回答
1
投票

在关于 分组比列的NaN(缺失)值有一句话。GroupBy中的NA组自动被排除在外.

显然,如果按以下方式分组,则是按 多重 列,同样的情况发生在 任何级别 的分组键包含 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

但如果你执行 群体性df.群体 打印内容),你会得到。

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

所以我们有一组 ('猎鹰',楠),包含索引的行 1.

如果你想处理 组,没有任何技巧来改变NaN 为其他内容,运行类似的命令。

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

这次打印出来的结果将包含之前缺失的组。


1
投票

要在 pandas 1.0 中循环处理所有组,你需要将 NoneType 对象为字符串。

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

然后你会得到四个循环的迭代。

根据 文件:

NA和NaT组处理

如果分组键中有任何NaN或NaT值,这些值将被自动排除。换句话说,永远不会有 "NA组 "或 "NaT组"。这在pandas的旧版本中并不是这样的,但无论如何,用户通常都会放弃NA组(支持它是一个令人头疼的实现)。

或者你可以升级到开发版的pandas 1.1,在那里 这个问题似乎可以通过以下选项来解决 dropna=False

© www.soinside.com 2019 - 2024. All rights reserved.