Python pandas如何处理dataframe 实现宽表转指定合并长表
实现方法
你需要的是将符合[PRE/POST]_[SPC数字]命名规则的宽表列转换为指定结构的长表,直接用pandas的melt方法即可完成,完整实现代码如下:
import pandas as pd # 原数据 df = pd.DataFrame({'CPDID': {0: 'C1', 1: 'C2', 2: 'C3'}, 'Rate': {0: 100, 1: 500, 2: 200}, 'PRE_SPC1': {0: 'NaN', 1: 'NaN', 2: 'NaN'}, 'POST_SPC2': {0:10, 1:50, 2:80}, 'POST_SPC3': {0:30, 1:40, 2:10}}) # 1. 宽表转长表,保留CPDID、Rate作为固定列 melt_df = df.melt(id_vars=['CPDID', 'Rate'], var_name='col_name', value_name='Damage') # 2. 拆分列名提取PRE和SPC信息 melt_df[['pre_tag', 'spc_tag']] = melt_df['col_name'].str.split('_', expand=True) # 映射PRE值:PRE为1,POST为0 melt_df['PRE'] = melt_df['pre_tag'].map({'PRE': 1, 'POST': 0}) # 提取SPC数字 melt_df['SPC'] = melt_df['spc_tag'].str.replace('SPC', '').astype(int) # 3. 筛选需要的列,调整顺序 final_df = melt_df[['CPDID', 'Rate', 'PRE', 'SPC', 'Damage']].reset_index(drop=True) # 输出结果 print(final_df)
结果说明
注意:你示例中给出的df2第三行CPDID为C2属于笔误,实际对应原数据第三行CPDID为C3,代码处理会自动匹配原数据的正确值
上述代码输出的final_df和你要求的pd.concat([df1, df2, df3])结果完全一致(示例中你只给出了SPC1对应的df1和SPC2对应的df2,代码会自动包含SPC3对应的数据行)。
如果需要单独提取某个SPC或者PRE分组的子表,直接按列筛选即可:
- 提取PRE=1的所有数据:
df_pre = final_df[final_df['PRE'] == 1] - 提取SPC=2的所有数据:
df_spc2 = final_df[final_df['SPC'] == 2]
内容的提问来源于stack exchange,提问作者Expectation mean first moment
相关产品推荐
相关产品推荐

