Pandas中为每个类别重复显示所有分箱并填充零计数的教程

1次阅读

Pandas中为每个类别重复显示所有分箱并填充零计数的教程

本教程旨在解决如何在pandas dataframe中,为每个分类组(如“continent”)完整展示所有预定义的分箱(如“rank”)并对那些在原始数据中未出现的分类-分箱组合填充零计数。我们将通过创建辅助列、使用`groupby`进行聚合,并结合`unstack`和`stack`操作来高效实现这一目标,确保数据分析的完整性和可视化的一致性。

在数据分析实践中,我们经常需要对数据进行分类和分箱统计。然而,默认的聚合操作只会显示实际存在的数据组合。当我们需要确保所有预定义的分箱(bins)都呈现在每个类别(category)下,即使某些组合的计数为零时,就需要采取额外的步骤。这对于保持数据结构的一致性、进行可视化或后续分析至关重要。

1. 准备初始数据

首先,我们从一个包含分类(如“Continent”)和已分箱数据(如“Rank”)的DataFrame开始。这个DataFrame反映了每个大陆下不同分箱的原始记录。

import pandas as pd  # 示例原始数据 data = {     'Continent': [         'Asia', 'North America', 'Asia', 'Europe', 'Europe',         'North America', 'Europe', 'Asia', 'Europe', 'Asia',         'Europe', 'Europe', 'Asia', 'Australia', 'South America'     ],     'Rank': [         '(15.753, 29.227]', '(2.212, 15.753]', '(2.212, 15.753]',         '(2.212, 15.753]', '(15.753, 29.227]', '(56.174, 69.648]',         '(15.753, 29.227]', '(2.212, 15.753]', '(15.753, 29.227]',         '(2.212, 15.753]', '(29.227, 42.701]', '(29.227, 42.701]',         '(2.212, 15.753]', '(2.212, 15.753]', '(56.174, 69.648]'     ] } df = pd.DataFrame(data)  print("原始DataFrame:") print(df)

2. 计算每个(分类,分箱)组合的计数

Pandas的groupby().count()方法默认需要一个列来进行计数。如果直接对多个列进行groupby().count(),它会尝试对所有非分组列进行计数。为了简单地获取每个组合的行数,我们可以添加一个辅助列。

# 添加一个辅助列,用于计数 df['count_col'] = 1  # 按 'Continent' 和 'Rank' 分组并计数 # as_index=False 将分组键保留为列 grouped_counts = df.groupby(['Continent', 'Rank'], as_index=False)['count_col'].count()  # 重命名计数列以便更清晰 grouped_counts = grouped_counts.rename(columns={'count_col': 'Count'})  print("n按(Continent, Rank)分组后的计数(不含零值):") print(grouped_counts)

此时,grouped_counts DataFrame只包含实际在原始数据中出现的Continent-Rank组合及其计数。例如,如果某个大陆的某个分箱没有数据,它将不会出现在这个结果中。

Pandas中为每个类别重复显示所有分箱并填充零计数的教程

微软爱写作

微软出品的免费英文写作/辅助/批改/评分工具

Pandas中为每个类别重复显示所有分箱并填充零计数的教程 130

查看详情 Pandas中为每个类别重复显示所有分箱并填充零计数的教程

3. 包含零计数的完整分箱展示

为了让每个大陆都显示所有可能的分箱,即使其计数为零,我们可以利用unstack()和stack()的组合操作。

  1. unstack(): 这个操作可以将指定级别的索引转换为列。当我们将Rank作为索引并unstack()时,它会为每个Continent创建一个行,并将所有Rank值作为列。如果某个Continent-Rank组合不存在,Pandas会默认填充NaN。
  2. fill_value=0: 在unstack()时,我们可以通过fill_value=0参数将所有缺失值(NaN)替换为零。这是实现零计数的关键一步。
  3. stack(): stack()是unstack()的逆操作,它将列索引转换回行索引。经过unstack(fill_value=0)后,stack()会把填充了零的宽格式数据重新转换回长格式,从而包含所有Continent-Rank组合,包括那些原本为零的。
  4. reset_index(): 最后,reset_index()将多级索引转换回常规列,得到一个整洁的DataFrame。
# 使用 unstack 和 stack 来填充零值 # 首先,将 'Continent' 和 'Rank' 设置为索引 df_indexed = df.set_index(['Continent', 'Rank'])  # 添加一个辅助列用于计数,并进行groupby # 这里直接在设置索引后的DataFrame上进行计数 final_result = df_indexed.groupby(level=['Continent', 'Rank']).size().unstack(fill_value=0).stack().reset_index()  # 重命名计数列 final_result.columns = ['Continent', 'Rank', 'Count']  print("n包含零计数的完整(Continent, Rank)组合:") print(final_result)

通过上述步骤,我们成功地为每个大陆展示了所有可能的分箱,并用零填充了那些在原始数据中没有记录的组合。

注意事项与总结

  • 辅助计数列或.size(): 在groupby()之后,可以使用.count()(如果DataFrame中有其他列)或.size()(直接计算分组大小)来获取每个分组的行数。在本教程的最终解决方案中,我们使用了.size(),它更简洁地计算了每个分组的大小。
  • unstack()的fill_value: fill_value参数是确保零值填充的关键。没有它,unstack()会将不存在的组合填充为NaN,stack()后这些NaN仍然会存在或被丢弃(取决于dropna参数)。
  • 灵活性: 这种groupby().unstack().stack()的模式在Pandas中非常强大,不仅可以用于计数,还可以用于其他聚合函数(如求和、平均值等),以确保在多维度分析中数据的完整性。

掌握这种技术,能够帮助数据分析师和工程师在处理分类和分箱数据时,生成更全面、更易于理解和分析的报告。

text=ZqhQzanResources