
本文介绍如何将 DataFrame 中某列(如 realized_price)的唯一值提取出来,作为一条新记录插入到底部,同时重命名其对应字段(如 simulation 列设为 'realized_price',simulated_price 列设为该值),实现“单值列 → 新行”的结构转换。
本文介绍如何将 dataframe 中某列(如 `realized_price`)的唯一值提取出来,作为一条新记录插入到底部,同时重命名其对应字段(如 `simulation` 列设为 `'realized_price'`,`simulated_price` 列设为该值),实现“单值列 → 新行”的结构转换。
在数据分析中,常需将具有全局意义的标量列(例如所有行都相同的 realized_price)从列形式“落地”为一行独立观测,以统一参与后续建模、可视化或导出。Pandas 并未提供直接的 .pivot() 或 .melt() 变体来处理这种“单值列转行”场景,但可通过组合索引操作与字典构造高效实现。
最简洁稳健的方法是利用 df.iloc[-1] 提取最后一行(因该列值恒定,任一行均可,但最后一行语义最清晰),将其转为字典后重构键值,并用 df.loc[len(df)] 追加新行:
# 假设 df 是原始 DataFrame
d = df.iloc[-1].to_dict()
d['simulated_price'] = d.pop('realized_price') # 将 realized_price 值赋给 simulated_price
d['simulation'] = 'realized_price' # 将 simulation 字段设为字符串标签
df.loc[len(df)] = d # 追加新行(注意:pop 后再 append 更安全)
df = df.drop('realized_price', axis=1) # 最终删除原列⚠️ 注意:上述代码中 df.loc[len(df)] 依赖于默认整数索引;若 DataFrame 索引非连续或含重复值,建议先重置索引:df = df.reset_index(drop=True)。
更通用、可复用的写法(支持任意列名)如下:
def column_to_last_row(df, src_col, target_col, label_value):
"""
将指定列的值(取最后一行)转为新行,并重映射字段。
Parameters:
-----------
df : pd.DataFrame
输入 DataFrame
src_col : str
待提取值的源列名(如 'realized_price')
target_col : str
值将被写入的目标列名(如 'simulated_price')
label_value : str
新行中用于标识的标签列值(如 'realized_price')
Returns:
--------
pd.DataFrame: 修改后的 DataFrame
"""
df = df.copy()
last_row = df.iloc[-1]
new_data = {
col: last_row[col] for col in df.columns if col != src_col and col != target_col
}
new_data[target_col] = last_row[src_col]
new_data['simulation'] = label_value # 此处假设目标列名为 'simulation';如不同请传参
# 安全追加:先 pop 原列,再 append
df = df.drop(columns=[src_col])
df.loc[len(df)] = new_data
return df
# 使用示例:
df_result = column_to_last_row(
df=df,
src_col='realized_price',
target_col='simulated_price',
label_value='realized_price'
)另一种推荐方案是使用 pd.concat(),语义清晰、不修改原索引、适合链式调用:
new_row = (df.iloc[[-1]] # 注意双层 [[]] 保持 DataFrame 结构
.assign(simulation='realized_price')
.assign(simulated_price=df['realized_price'].iat[0])
.drop('realized_price', axis=1))
df_result = pd.concat([df.drop('realized_price', axis=1), new_row],
ignore_index=True)✅ 总结:
- 首选
iloc[-1].to_dict()+loc[len(df)]方案:轻量、高效、易理解; - 若需强健性与可维护性,封装为函数并显式处理列名;
-
pd.concat()更适合复杂 pipeline,避免隐式索引副作用; -
务必在操作前确认
realized_price列值确实恒定(可用df['realized_price'].nunique() == 1校验),否则逻辑失效。

















