如何转置重排城市气温降雨DataFrame至目标格式?
解决方法
你可以用pandas的pd.wide_to_long()函数实现这种宽表转长表的转换,这个函数专门适配列名是「类别_指标」格式的场景,完美匹配你的需求。
步骤1:还原原始数据
先把你的示例DataFrame用代码还原:
import pandas as pd data = { 'Datetime': ['2022-01-01 10:00:00', '2022-01-01 11:00:00', '2022-01-01 12:00:00', '2022-01-01 13:00:00'], 'Berlin_temperature': [24,24,24,24], 'Dublin_temperature': [24,24,24,24], 'London_temperature': [24,24,24,24], 'Paris_temperature': [24,24,24,24], 'Berlin_rain': [10,10,10,10], 'Dublin_rain': [10,10,10,10], 'London_rain': [10,10,10,10], 'Paris_rain': [10,10,10,10] } df = pd.DataFrame(data)
步骤2:用wide_to_long完成转换
# 执行宽转长操作 df_long = pd.wide_to_long( df, stubnames=['temperature', 'rain'], # 指定指标的前缀(去掉城市名后的部分) i='Datetime', # 保留的基准列 j='City', # 拆分出来的城市列名称 sep='_', # 列名里的分隔符 suffix='.*' # 匹配分隔符后的任意字符(这里就是城市名) ) # 重置索引,把Datetime和City变回普通列 df_long = df_long.reset_index() # 重命名列名匹配你的目标结构 df_long = df_long.rename(columns={ 'temperature': 'Temperature', 'rain': 'Rainfall' }) # 调整列顺序 df_long = df_long[['Datetime', 'City', 'Temperature', 'Rainfall']]
运行后得到的结果就和你想要的结构完全一致。
备选方案:用melt函数分步处理
如果你更习惯用melt,可以拆分温度和降雨数据后再合并:
# 处理温度列 temp_df = df.melt( id_vars='Datetime', value_vars=['Berlin_temperature', 'Dublin_temperature', 'London_temperature', 'Paris_temperature'], var_name='City', value_name='Temperature' ) # 提取城市名称(去掉末尾的_temperature) temp_df['City'] = temp_df['City'].str.replace('_temperature', '') # 处理降雨列 rain_df = df.melt( id_vars='Datetime', value_vars=['Berlin_rain', 'Dublin_rain', 'London_rain', 'Paris_rain'], var_name='City', value_name='Rainfall' ) rain_df['City'] = rain_df['City'].str.replace('_rain', '') # 合并两个DataFrame df_long = pd.merge(temp_df, rain_df, on=['Datetime', 'City'])
这个方法同样能得到目标结构,只是步骤稍多。
内容的提问来源于stack exchange,提问作者Aiden Blake
相关产品推荐
相关产品推荐

