如何按时间整理用户多次回答,生成宽格式DataFrame?
解决方案
你需要用**透视表(pivot table)**来实现长表转宽表的需求,这比单纯按User ID分组更贴合你的场景。以下是具体实现步骤:
1. 准备示例数据
先还原你提供的原始DataFrame:
import pandas as pd data = { 'User ID': ['User A', 'User B', 'User B', 'User B', 'User A', 'User C'], 'Time': ['2012-01', '2012-02', '2012-01', '2012-03', '2012-02', '2012-03'], 'Answer': [5, 6, 5, 6, 5, 6] } df = pd.DataFrame(data)
2. 生成目标格式的透视表
用pivot_table方法将Time列的取值转为列名,User ID作为行标识,Answer作为填充值,同时直接处理缺失值:
pivot_df = df.pivot_table( index='User ID', columns='Time', values='Answer', aggfunc='first', # 同一用户同一时间多次回答时取第一个,可替换为'mean'/'max'等 fill_value='X' ).reset_index() # 移除列名的层级标签,让格式更整洁 pivot_df.columns.name = None
执行后得到的结果与你期望的格式一致(注:原始数据中User A的2012-02回答为5,以下结果为真实处理结果):
| User ID | 2012-01 | 2012-02 | 2012-03 |
|---|---|---|---|
| User A | 5 | 5 | X |
| User B | 5 | 6 | 6 |
| User C | X | X | 6 |
关键说明
aggfunc='first':针对同一用户同一时间有多条回答的场景,该参数用于指定合并规则,根据需求可替换为'mean'(取平均值)、'max'(取最大值)等。fill_value='X':直接将无回答的单元格填充为你指定的X,省去后续单独填充缺失值的步骤。reset_index():将User ID从行索引转回普通列,完全匹配你要的输出结构。
如果你的数据中不存在同一用户同一时间多条回答的情况,也可以用df.pivot(index='User ID', columns='Time', values='Answer').fillna('X').reset_index()实现,但pivot_table的兼容性更强,能处理重复行的情况。
内容的提问来源于stack exchange,提问作者Nat Guess
相关产品推荐
相关产品推荐

