如何在Pandas中对含重复_REACTION TIME_字段的DataFrame聚合透视
解决Pandas部分重复字段的宽格式转换问题
步骤说明
核心思路是给重复出现的_REACTION TIME_字段按ID内的出现顺序添加序号,再将长格式数据转成宽格式。
代码实现
首先构造示例数据(如果已有DataFrame可跳过这一步):
import pandas as pd data = [ [1, 'consent', 'yes'], [1, '_REACTION TIME_', 5547], [1, 'age', 24], [1, 'gender', 'X'], [1, '_REACTION TIME_', 45396], [1, 'education', 'uni'], [1, 'language', 'EN'], [1, '_REACTION TIME_', 105187], [2, 'consent', 'yes'], [2, '_REACTION TIME_', 3547], [2, 'age', 25], [2, 'gender', 'F'], [2, '_REACTION TIME_', 42396], [2, 'education', 'uni'], [2, 'language', 'EU'], [2, '_REACTION TIME_', 115427] ] df = pd.DataFrame(data, columns=['id', 'Field_name', 'Field_value'])
接下来执行转换操作:
# 1. 给每个ID下的重复字段添加序号 df['seq'] = df.groupby(['id', 'Field_name']).cumcount() + 1 # 2. 生成新列名:仅给_REACTION TIME_添加序号,其他字段保留原名 df['col_name'] = df.apply( lambda row: f"{row['Field_name']}_{row['seq']}" if row['Field_name'] == '_REACTION TIME_' else row['Field_name'], axis=1 ) # 3. 转成宽格式 wide_df = df.pivot(index='id', columns='col_name', values='Field_value').reset_index() # 4. 调整列顺序(和示例对齐,可选) target_cols = [ 'id', 'consent', '_REACTION TIME_1', 'age', 'gender', '_REACTION TIME_2', 'education', 'language', '_REACTION TIME_3' ] wide_df = wide_df[target_cols]
输出结果
运行后得到的wide_df就是你需要的格式:
id consent _REACTION TIME_1 age gender _REACTION TIME_2 education language _REACTION TIME_3 0 1 yes 5547 24 X 45396 uni EN 105187 1 2 yes 3547 25 F 42396 uni EU 115427
关键逻辑说明
groupby(['id', 'Field_name']).cumcount():给每个ID下的同名字段按出现顺序编号,确保重复的_REACTION TIME_能区分开。- 自定义列名:只给重复的目标字段加序号,避免其他唯一字段出现多余后缀。
pivot方法:直接将长格式数据转成每行对应一个ID的宽格式,自动聚合唯一值。
内容的提问来源于stack exchange,提问作者baskcat
相关产品推荐
相关产品推荐

