You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从多标量值向MultiIndex DataFrame批量添加多列?

问题描述

现有一个多层索引(MultiIndex)的DataFrame df,结构如下:

foo
onetwo
"12345""1235"
"12345""1345"

需要给它添加多列,每列所有行填充同一值(不同列值不同),这些值存储在一个多层索引的Series se中,结构示例如下:

|bar | 0  | 2 |
|    | 1  | 3 |
 ...  ...  ...
|    | 99 | 7 |

预期结果为:

| foo      |          | bar |     | ... |     |
| one      | two      | 0   | 1   | ... | 99  |
| -------- | -------- | --- | --- | ... | --- |
| "12345"  | "1235"   | 2   | 3   | ... | 7   |
| "12345"  | "1345"   | 2   | 3   | ... | 7   |

当前使用循环插入列的方式实现,代码冗余且触发性能警告:

for i in range(len(se)):
    df["bar", i] = se[i]

警告信息:

PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling frame.insert many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use newframe = frame.copy()

优化解决方案

直接利用pd.concat一次性拼接所有新列,避免循环插入导致的性能问题和碎片化:

方法一:快速生成重复值DataFrame

import pandas as pd

# 将Series转换为与df行数匹配的DataFrame,每列重复对应的值
se_expanded = pd.DataFrame([se.values] * len(df), columns=se.index)
# 横向拼接原DataFrame和新生成的列
df = pd.concat([df, se_expanded], axis=1)

方法二:利用索引重排填充(更高效)

# 将Series转为单行DataFrame,然后重排索引匹配df的行数并向前填充
se_expanded = se.to_frame().T.reindex(df.index).ffill()
# 拼接
df = pd.concat([df, se_expanded], axis=1)

这两种方法都能一次性完成所有列的添加,彻底消除性能警告,同时代码更简洁高效。

内容的提问来源于stack exchange,提问作者mlschuler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:08:15