如何将DataFrame两类组合的计数结果填充至指定结构的DataFrame?
将分组计数结果转为指定结构的DataFrame
方法1:对分组结果使用unstack()
先通过groupby获取带分层索引的计数值,再用unstack()将二级索引转为列,同时可指定fill_value填充缺失的组合(比如填充0):
# 获取分组计数的分层索引Series count_series = df.groupby(['type1', 'type2'])['data'].count() # 转换为目标结构的DataFrame,缺失组合填充为0 m_df = count_series.unstack(fill_value=0)
以你提供的简化示例为例,执行后得到的m_df如下:
type2 female male type1 bunny 1 0 chicken 0 1 cow 1 1 elephant 0 1 pig 1 1
如果需要严格匹配你预先排序好的grp1和grp2,可以追加reindex步骤对齐索引和列:
grp1 = sorted(df['type1'].unique()) grp2 = sorted(df['type2'].unique()) m_df = count_series.unstack(fill_value=0).reindex(index=grp1, columns=grp2)
方法2:直接使用pivot_table()一步生成
无需先执行groupby,用pivot_table直接指定行、列、聚合规则,一步得到目标结构:
m_df = df.pivot_table( index='type1', # 行对应type1 columns='type2', # 列对应type2 values='data', # 用于计数的字段 aggfunc='count', # 聚合方式为计数 fill_value=0 # 缺失组合填充为0 )
该方法结果与方法1完全一致,代码更简洁。
内容的提问来源于stack exchange,提问作者Baaridi
相关产品推荐
相关产品推荐

