如何在Pandas中按列名后缀合并列并关联对应温度列
Pandas 合并指定列并关联对应温度列的实现
原始数据结构
| date | paris_price | temperature_paris_weather | lyon_price | temperature_lyon_weather |
|---|---|---|---|---|
| 2023-01-01 | -4.2 | 3.0 | -3.8 | 3.2 |
| 2023-01-02 | -5.04 | 2.8 | -3.8 | 3.2 |
目标数据结构
| price | temperature |
|---|---|
| -4.2 | 3.0 |
| -3.8 | 3.2 |
| -5.04 | 2.8 |
| -3.8 | 3.2 |
实现方法
方法一:基于melt的匹配合并
逻辑清晰,适合列名规则固定的场景:
import pandas as pd # 构建原始DataFrame(实际场景可直接读取已有数据) df = pd.DataFrame({ 'date': ['2023-01-01', '2023-01-02'], 'paris_price': [-4.2, -5.04], 'temperature_paris_weather': [3.0, 2.8], 'lyon_price': [-3.8, -3.8], 'temperature_lyon_weather': [3.2, 3.2] }) # 筛选所有以_price结尾的列 price_cols = [col for col in df.columns if col.endswith('_price')] # 根据price列名匹配对应的temperature列 temp_cols = [f'temperature_{col.split("_")[0]}_weather' for col in price_cols] # 将price和temperature列分别转成纵向结构 price_df = df.melt(value_vars=price_cols, value_name='price') temp_df = df.melt(value_vars=temp_cols, value_name='temperature') # 合并结果并清理无关列 result = pd.concat([price_df['price'], temp_df['temperature']], axis=1).reset_index(drop=True)
方法二:利用多级列名转长表
扩展性更强,适合后续可能新增同类城市列的场景:
import pandas as pd df = pd.DataFrame({ 'date': ['2023-01-01', '2023-01-02'], 'paris_price': [-4.2, -5.04], 'temperature_paris_weather': [3.0, 2.8], 'lyon_price': [-3.8, -3.8], 'temperature_lyon_weather': [3.2, 3.2] }) # 移除date列 df = df.drop('date', axis=1) # 拆分列名,提取【城市】和【指标类型】两个维度 df.columns = df.columns.str.extract(r'(.*)_(price|temperature.*)') # 将城市维度转为行,再整理列名和顺序 df_long = df.stack(level=0).reset_index(drop=True) result = df_long.rename(columns={'price': 'price', 'temperature_weather': 'temperature'})[['price', 'temperature']]
两种方法执行后均能得到目标结构的DataFrame。
内容的提问来源于stack exchange,提问作者lizard
相关产品推荐
相关产品推荐

