按多列分组,数据缺失。
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版本
在关于 分组比列的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]]}')
这次打印出来的结果将包含之前缺失的组。
要在 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