如何通过df.iloc合并同结构子DataFrame?解决索引越界错误及寻求替代方案
解决嵌套子DataFrame循环concat时的索引越界问题及高效替代方案
看起来你遇到了两个核心问题:一是循环遍历时候的索引越界错误,二是想找到更高效的方式实现「每个子DataFrame复制自身后合并」的需求。我来帮你一步步拆解解决:
一、先解决索引越界的直接问题
你报错的IndexError: single positional indexer is out-of-bounds,本质是你写了固定的range(0,190),但你的数据集实际行数可能不足190(比如可能是189行或者其他数量)。解决这个很简单,把循环范围改成基于数据集实际行数:
import pandas as pd # 初始化空的结果DataFrame result = pd.DataFrame() # 遍历数据集的每一行,用len(df)确保不会越界 for i in range(len(df)): # 复制当前子DataFrame并合并 temp_df = pd.concat([df.iloc[i], df.iloc[i]]) result = pd.concat([result, temp_df], ignore_index=True)
这样就不会再触发索引越界的错误了。
二、更高效的替代方案(避免循环多次concat)
上面的循环方法虽然能解决问题,但每次循环都执行pd.concat会不断创建新的DataFrame,效率偏低。推荐用以下两种更简洁高效的方式:
方法1:用apply批量处理子DataFrame
通过apply对主DataFrame的每一行(子DataFrame)执行「复制自身」的操作,最后一次性合并所有结果:
# 对每个子DataFrame执行concat自身,再合并所有处理后的子DataFrame result = pd.concat(df.apply(lambda x: pd.concat([x, x]), axis=1).tolist(), ignore_index=True)
方法2:列表推导式预生成所有子DataFrame
先把所有需要合并的子DataFrame(包括复制后的)放到列表里,再一次性concat:
# 先获取所有原始子DataFrame的列表 original_sub_dfs = [df.iloc[i] for i in range(len(df))] # 生成包含复制后子DataFrame的列表(每个子DataFrame出现2次) all_sub_dfs = [sub_df.copy() for sub_df in original_sub_dfs for _ in range(2)] # 一次性合并所有子DataFrame result = pd.concat(all_sub_dfs, ignore_index=True)
这两种方法都避免了循环中多次合并的性能损耗,代码也更简洁易读。
补充说明
你的主DataFrame结构比较特殊——每一行都是一个嵌套的子DataFrame,这种结构在处理时要注意:
- 确保
df.iloc[i]返回的确实是一个合法的子DataFrame(而不是Series) - 如果后续还有类似的嵌套数据处理需求,可以考虑先把主DataFrame展开成扁平结构,再进行操作,会更方便
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

