如何用Pandas将含重复日期的DataFrame转换为宽表结构
解决Pandas DataFrame长表转宽表问题
原始数据结构
先构造你的原始DataFrame:
import pandas as pd df = pd.DataFrame({ 'date': ['2023-02-13', '2023-02-13', '2023-02-13', '2023-02-10', '2023-02-08', '2023-02-08', '2023-02-05', '2023-02-02'], 'data': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'], 'meter_id': [1, 2, 6, 1, 1, 2, 1, 2] })
原始表格结构:
| date | data | meter_id |
|---|---|---|
| 2023-02-13 | a | 1 |
| 2023-02-13 | b | 2 |
| 2023-02-13 | c | 6 |
| 2023-02-10 | d | 1 |
| 2023-02-08 | e | 1 |
| 2023-02-08 | f | 2 |
| 2023-02-05 | g | 1 |
| 2023-02-02 | h | 2 |
转换方法:使用pivot函数
直接用Pandas的pivot方法就能实现需求,指定行索引、列名和值的来源:
pivoted_df = df.pivot(index='date', columns='meter_id', values='data').reset_index() # 移除列索引的默认名称,和目标结构对齐 pivoted_df.columns.name = None
转换后的结果
执行后得到的DataFrame结构如下:
| date | 1 | 2 | 6 |
|---|---|---|---|
| 2023-02-13 | a | b | c |
| 2023-02-10 | d | NaN | NaN |
| 2023-02-08 | e | f | NaN |
| 2023-02-05 | g | NaN | NaN |
| 2023-02-02 | NaN | h | NaN |
补充说明
如果数据中存在同一日期+同一meter_id对应多条data的情况,pivot会报错,这时可以改用pivot_table并指定聚合方式(比如取第一个值):
# 示例:取同一分组的第一个值 pivoted_df = df.pivot_table(index='date', columns='meter_id', values='data', aggfunc='first').reset_index() pivoted_df.columns.name = None
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

