You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对DataFrame按param字段透视,同时保留数值与对应单位?

按param字段透视DataFrame并保留对应数值与单位

问题说明

输入DataFrame:

id  city    state date      param  value unit
1   Phoenix AZ    4-21-2024 temp   100  F
2   Phoenix AZ    4-21-2024 prec   0    mm
3   Phoenix AZ    4-21-2024 wind   2    mph
4   Phoenix AZ    4-20-2024 temp   101  F
5   Phoenix AZ    4-20-2024 prec   0    NaN
6   Phoenix AZ    4-20-2024 wind   4    mph
7   Seattle WA    4-20-2024 temp   82   F
8   Seattle WA    4-20-2024 prec   3    mm
9   Seattle WA    4-20-2024 wind   5    mph

需转换为如下透视格式,同时保留每个param对应的数值和单位:

id  city    state date       temp prec wind temp_unit prec_unit wind_unit
1   Phoenix AZ    4-21-2024  100  0    2    F         mm        mph
2   Phoenix AZ    4-20-2024  101  0    4    F                   mph
3   Seattle WA    4-20-2024  82   3    5    F         mm        mph

解决方法

使用pandas的pivot方法结合列名调整实现,具体步骤如下:

1. 准备数据

先导入pandas并构造输入DataFrame:

import pandas as pd

data = [
    [1, 'Phoenix', 'AZ', '4-21-2024', 'temp', 100, 'F'],
    [2, 'Phoenix', 'AZ', '4-21-2024', 'prec', 0, 'mm'],
    [3, 'Phoenix', 'AZ', '4-21-2024', 'wind', 2, 'mph'],
    [4, 'Phoenix', 'AZ', '4-20-2024', 'temp', 101, 'F'],
    [5, 'Phoenix', 'AZ', '4-20-2024', 'prec', 0, None],
    [6, 'Phoenix', 'AZ', '4-20-2024', 'wind', 4, 'mph'],
    [7, 'Seattle', 'WA', '4-20-2024', 'temp', 82, 'F'],
    [8, 'Seattle', 'WA', '4-20-2024', 'prec', 3, 'mm'],
    [9, 'Seattle', 'WA', '4-20-2024', 'wind', 5, 'mph']
]
df = pd.DataFrame(data, columns=['id', 'city', 'state', 'date', 'param', 'value', 'unit'])

2. 生成新的分组ID

原输入中同一城市-日期组对应多个id,输出需要每组一个唯一id,因此先分组生成新id:

df['new_id'] = df.groupby(['city', 'state', 'date']).ngroup() + 1

3. 执行透视操作

以new_id、city、state、date为索引,param为列,同时透视value和unit两个字段:

pivoted = df.pivot(index=['new_id', 'city', 'state', 'date'], columns='param', values=['value', 'unit']).reset_index()

4. 调整列名

将透视后的双层列名转换为目标格式(如value_temp转为temp,unit_temp转为temp_unit):

pivoted.columns = [col[1] if col[0] == 'value' else f"{col[1]}_unit" for col in pivoted.columns]
pivoted.rename(columns={'new_id': 'id'}, inplace=True)

5. 调整列顺序

按照目标格式的列顺序重新排列:

final_columns = ['id', 'city', 'state', 'date', 'temp', 'prec', 'wind', 'temp_unit', 'prec_unit', 'wind_unit']
result = pivoted[final_columns]

最终结果

运行上述代码后,得到的result即为目标格式:

id     city state        date  temp  prec  wind temp_unit prec_unit wind_unit
0   1  Phoenix    AZ  4-21-2024   100     0     2         F        mm       mph
1   2  Phoenix    AZ  4-20-2024   101     0     4         F       NaN       mph
2   3  Seattle    WA  4-20-2024    82     3     5         F        mm       mph

内容的提问来源于stack exchange,提问作者Shankze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:19:55