如何反转pd.melt去重结果,实现pandas DataFrame长表转宽表
解决方案
报错原因
pivot_table默认会对同分组的数据执行聚合运算,要求values字段为数值类型,你需要保留同一个event下Table和Cell的全部匹配组合,不需要聚合操作,因此不适用pivot_table。
实现方法
方法1:拆分关联法(适用type数量少的场景,代码最简单)
先分别提取Table和Cell两类数据,再按event字段做关联即可得到目标结果:
# 提取Table类型数据 table_df = df[df['type'] == 'Table'].rename(columns={'entity': 'Table'})[['event', 'Table']] # 提取Cell类型数据 cell_df = df[df['type'] == 'Cell'].rename(columns={'entity': 'Cell'})[['event', 'Cell']] # 按event关联得到结果 result = table_df.merge(cell_df, on='event')
方法2:辅助列pivot法(适用type数量多的场景,扩展性强)
先给每个event下同类型的行添加组内序号作为辅助索引,再做pivot即可避免聚合报错:
# 新增辅助列:记录同一个event、同一个type下的行序号 df['aux_idx'] = df.groupby(['event', 'type']).cumcount() # pivot时指定双索引避免聚合,最后删除辅助列即可 result = df.pivot(index=['event', 'aux_idx'], columns='type', values='entity')\ .reset_index()\ .drop(columns='aux_idx')
内容的提问来源于stack exchange,提问作者Akash Kumar
相关产品推荐
相关产品推荐

