如何从多标量值向MultiIndex DataFrame批量添加多列?
问题描述
现有一个多层索引(MultiIndex)的DataFrame df,结构如下:
| foo | |
|---|---|
| one | two |
| "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
相关产品推荐
相关产品推荐

