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的迭代器访问无关。