如何对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
相关产品推荐
相关产品推荐

