如何将pandas DataFrame中的多列Value与Rental分别合并为单列
Pandas多列合并解决方案
首先匹配所有需要合并的Value列和Rental列,再根据你的合并需求选择对应方法:
前置代码(列筛选)
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 读取原始数据 df = pd.read_excel('HW2_Data.xlsx', sheet_name='Problem 4') # 筛选所有列名包含Value的列 value_cols = [col for col in df.columns if 'Value' in col] # 筛选所有列名包含Rental的列 rental_cols = [col for col in df.columns if 'Rental' in col]
原数据结构参考:
方案1:按行合并(每行仅保留1个有效值场景)
如果同一行的多个Value列只有1个非空值,需要把每行的非空Value合并到同一列,Rental同理,使用如下代码:
# 合并Value列:取每行第一个非空的Value值 df['Value'] = df[value_cols].bfill(axis=1).iloc[:, 0] # 合并Rental列 df['Rental'] = df[rental_cols].bfill(axis=1).iloc[:, 0] # 删去原始多列,仅保留需要的字段 df_final = df.drop(columns=value_cols + rental_cols) print(df_final)
方案2:按列堆叠(宽表转长表场景)
如果需要把所有Value列的数值全部堆叠为单列,对应的Rental列也同步堆叠,使用如下代码:
# 提取不需要参与转换的公共维度列(如ID、类别、日期等) id_cols = [col for col in df.columns if col not in value_cols + rental_cols] # 转换Value列为长表 value_df = pd.melt(df, id_vars=id_cols, value_vars=value_cols, value_name='Value').drop('variable', axis=1) # 转换Rental列为长表 rental_df = pd.melt(df, id_vars=id_cols, value_vars=rental_cols, value_name='Rental').drop('variable', axis=1) # 合并结果并删除空值行 df_final = pd.concat([value_df, rental_df['Rental']], axis=1).dropna(subset=['Value', 'Rental']).reset_index(drop=True) print(df_final)
内容的提问来源于stack exchange,提问作者Zack Adams
相关产品推荐
相关产品推荐

