使用Pandas实现列转行:重构多字段新旧值数据集
Pandas实现列转行数据转换方法
原始数据集
| ID | Old value.Carbon | Old value.Dioxide | New value.Carbon | New Value.Dioxide |
|---|---|---|---|---|
| 123 | 34.89 | 13.45 | 56.66 | 11.11 |
| 456 | 12.13 | 55.66 | 66.88 | 12.33 |
目标数据集
| ID | Field | New Value | Old Value |
|---|---|---|---|
| 123 | Carbon | 56.66 | 34.89 |
| 123 | Dioxide | 11.11 | 13.45 |
| 456 | Carbon | 66.88 | 12.13 |
| 456 | Dioxide | 12.33 | 55.66 |
实现方法
以下提供两种简洁的Pandas实现方式,按需选择:
方法一:先转长表再透视(灵活通用)
import pandas as pd # 构造原始数据(实际场景可替换为pd.read_csv/pd.read_excel读取文件) data = { 'ID': [123, 456], 'Old value.Carbon': [34.89, 12.13], 'Old value.Dioxide': [13.45, 55.66], 'New value.Carbon': [56.66, 66.88], 'New Value.Dioxide': [11.11, 12.33] } df = pd.DataFrame(data) # 1. 将宽表转为长表,保留ID作为标识列 melted_df = df.melt(id_vars='ID', var_name='Type.Field', value_name='Value') # 2. 拆分列名,分离出值类型(Old/New)和Field melted_df[['Type', 'Field']] = melted_df['Type.Field'].str.split('.', expand=True) # 3. 统一值类型的命名格式 melted_df['Type'] = melted_df['Type'].replace({ 'Old value': 'Old Value', 'New value': 'New Value', 'New Value': 'New Value' }) # 4. 透视表转成目标格式 result_df = melted_df.pivot_table( index=['ID', 'Field'], columns='Type', values='Value', aggfunc='first' ).reset_index() # 5. 调整列顺序匹配目标结构 result_df = result_df[['ID', 'Field', 'New Value', 'Old Value']] print(result_df)
方法二:拆分合并(逻辑直观)
import pandas as pd # 构造原始数据 data = { 'ID': [123, 456], 'Old value.Carbon': [34.89, 12.13], 'Old value.Dioxide': [13.45, 55.66], 'New value.Carbon': [56.66, 66.88], 'New Value.Dioxide': [11.11, 12.33] } df = pd.DataFrame(data) # 1. 处理Old Value相关列,转长表 old_df = df[['ID', 'Old value.Carbon', 'Old value.Dioxide']].rename( columns={'Old value.Carbon': 'Carbon', 'Old value.Dioxide': 'Dioxide'} ).melt(id_vars='ID', var_name='Field', value_name='Old Value') # 2. 处理New Value相关列,转长表 new_df = df[['ID', 'New value.Carbon', 'New Value.Dioxide']].rename( columns={'New value.Carbon': 'Carbon', 'New Value.Dioxide': 'Dioxide'} ).melt(id_vars='ID', var_name='Field', value_name='New Value') # 3. 合并两个表得到最终结果 result_df = pd.merge(old_df, new_df, on=['ID', 'Field']) # 4. 调整列顺序 result_df = result_df[['ID', 'Field', 'New Value', 'Old Value']] print(result_df)
内容的提问来源于stack exchange,提问作者Andrew Pike
相关产品推荐
相关产品推荐

