Python 环绕熊猫';按多列分组和缺少数据时的groupby输出

Python 环绕熊猫';按多列分组和缺少数据时的groupby输出,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,按缺少数据的多列分组: data = [['Falcon', 'Captive', 390], ['Falcon', None, 350], ['Parrot', 'Captive', 30], ['Parrot', 'Wild', 20]] df = pd.DataFrame(data, columns = ['Animal', 'Type', 'Max Speed']) 我理解按单个列进行分组()时如何处理缺少的数据,但不理解按两列进行分组时的行为 似乎我无法对所有组进行循

按缺少数据的多列分组:

data = [['Falcon', 'Captive', 390], ['Falcon', None, 350],
        ['Parrot', 'Captive', 30], ['Parrot', 'Wild', 20]]
df = pd.DataFrame(data, columns = ['Animal', 'Type', 'Max Speed'])
我理解按单个列进行分组()时如何处理缺少的数据,但不理解按两列进行分组时的行为

似乎我无法对所有组进行循环,即使它们似乎已确定:

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版

要在Pandas 1.0中的所有组上循环,您需要将
非类型
对象转换为字符串

df = df.astype(str) # or just df['Type'] = df['Type'].astype(str) 
然后您将得到循环的四次迭代

根据报告:

NA和NaT组处理

如果数据库中存在任何NaN或NaT值 分组键,这些将被自动排除。换句话说,, 永远不会有“NA组”或“NaT组”。这并不是问题所在 在旧版本的熊猫中出现了这种情况,但用户通常会丢弃它们 NA组(支持它是一个实现) 头痛)


或者您可以升级到dev pandas 1.1,在那里

要在pandas 1.0中循环所有组,您需要将
NoneType
对象转换为字符串

df = df.astype(str) # or just df['Type'] = df['Type'].astype(str) 
然后您将得到循环的四次迭代

根据报告:

NA和NaT组处理

如果数据库中存在任何NaN或NaT值 分组键,这些将被自动排除。换句话说,, 永远不会有“NA组”或“NaT组”。这并不是问题所在 在旧版本的熊猫中出现了这种情况,但用户通常会丢弃它们 NA组(支持它是一个实现) 头痛)

或者,您可以升级到dev pandas 1.1,其中

在关于带有NaN(缺少)值的groupby列的帖子中 有一句话: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
但如果执行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]]}')
这一次,打印输出还将包含以前缺少的组。

在关于带有NaN(缺少)值的groupby列的帖子中 有一句话: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
但如果执行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]]}')

这一次,打印输出还将包含以前丢失的组。

是,但如果对groupeddf.groups中的组执行
,则得到4是,但如果对groupeddf.groups中的组执行
,则得到4所以,它被排除,但不是真正排除?我了解变通方法,但不了解DataFrameGroupBy对象。上述排除仅涉及“迭代器访问”(for循环)如何在GrouBy对象本身上工作。正如我刚刚发现的,它不属于对groupy.groups的迭代器访问。所以,它被排除在外,但不是真正排除在外?我了解变通方法,但不了解DataFrameGroupBy对象。上述排除仅涉及“迭代器访问”(for循环)如何在GrouBy对象本身上工作。正如我刚刚发现的,它与对groupy.groups的迭代器访问无关。