Pandas:标记ID分组归属并转换数据结构的实现需求
实现方案
原始数据
import pandas as pd raw_data = pd.DataFrame({ 'Year': [1991, 1991, 1991, 2000, 2000], 'ID': ['A', 'A', 'A', 'B', 'B'], 'Group': ['a', 'b', 'c', 'a', 'b'], 'score': [6252, 6252, 6252, 2342, 2342] })
方法一:透视表实现
利用pivot_table生成分组存在标记,再转换为Yes/No格式:
# 生成透视表,标记分组是否存在 pivot_df = raw_data.pivot_table( index=['Year', 'ID', 'score'], columns='Group', values='Group', aggfunc=lambda x: 1, fill_value=0 ) # 重命名列并替换标记文本 pivot_df = pivot_df.rename(columns=lambda x: f'Group {x}').replace({1: 'Yes', 0: 'No'}) # 重置索引得到目标结构 out_data = pivot_df.reset_index() print(out_data)
方法二:哑变量+分组聚合
通过get_dummies生成分组哑变量,再分组聚合得到结果:
# 生成分组哑变量 dummies = pd.get_dummies(raw_data['Group'], prefix='Group') # 合并数据后按ID/Year/score分组取最大值(同一分组存在则为1,否则0) out_data = pd.concat([raw_data, dummies], axis=1).groupby(['Year', 'ID', 'score']).max().reset_index() # 将数值标记转换为Yes/No out_data = out_data.replace({1: 'Yes', 0: 'No'}) print(out_data)
输出结果
两种方法都会得到目标数据:
Year ID score Group a Group b Group c 0 1991 A 6252 Yes Yes Yes 1 2000 B 2342 Yes Yes No
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

