在pandas DataFrame中高效生成数据增强新行的最优方法
高效实现Pandas数据增强:批量生成拼接行
针对大数据量下pd.iterrows()速度过慢的问题,以下是三种高效的实现方案,均基于Pandas/Numpy的底层优化操作,性能远优于逐行遍历:
方案1:利用交叉合并(merge cross)生成笛卡尔积
通过生成变体列表的DataFrame,与原数据做交叉合并得到所有组合,再完成字符串拼接,最后合并原数据与增强数据:
import pandas as pd # 示例原数据 df = pd.DataFrame({ "Compliment": ["Hi", "Hello", "Hola"], "Sentence_ID": [1, 2, 3] }) variations = ["Elvis", "Monica"] # 将变体列表转为DataFrame var_df = pd.DataFrame({"variation": variations}) # 交叉合并得到所有原行与变体的组合 merged = df.merge(var_df, how="cross") # 拼接生成新的Compliment内容 merged["Compliment"] = merged["Compliment"] + " " + merged["variation"] # 合并原数据与增强数据,按Sentence_ID排序 result = pd.concat([df, merged.drop("variation", axis=1)]) \ .sort_values("Sentence_ID") \ .reset_index(drop=True) print(result)
该方法依赖Pandas优化的合并逻辑,适合中等规模数据集,代码可读性强。
方案2:结合apply与explode展开列表
为每行生成包含原内容和所有拼接内容的列表,再通过explode将列表拆分为多行:
import pandas as pd df = pd.DataFrame({ "Compliment": ["Hi", "Hello", "Hola"], "Sentence_ID": [1, 2, 3] }) variations = ["Elvis", "Monica"] # 为每行生成增强内容列表:原内容 + 所有拼接后的内容 df["Compliment"] = df["Compliment"].apply( lambda x: [x] + [f"{x} {var}" for var in variations] ) # 展开列表为多行 result = df.explode("Compliment").reset_index(drop=True) print(result)
此方法代码最简洁,apply为向量化实现,explode是Pandas高效行展开操作,适合中小规模数据集。
方案3:Numpy广播机制(超大数据量最优)
利用Numpy的广播特性直接生成所有组合,底层为C级运算,速度最快,适合百万级以上数据集:
import pandas as pd import numpy as np df = pd.DataFrame({ "Compliment": ["Hi", "Hello", "Hola"], "Sentence_ID": [1, 2, 3] }) variations = ["Elvis", "Monica"] # 广播生成所有Compliment组合:原内容 + 所有拼接内容 compliments = np.concatenate([ df["Compliment"].values[:, np.newaxis], df["Compliment"].values[:, np.newaxis] + " " + np.array(variations)[np.newaxis, :] ], axis=1).flatten() # 广播生成对应的Sentence_ID(重复原ID len(variations)+1次) sentence_ids = np.repeat(df["Sentence_ID"].values, len(variations)+1) # 构造结果DataFrame result = pd.DataFrame({ "Compliment": compliments, "Sentence_ID": sentence_ids }) print(result)
方案选择参考
- 中小数据集:优先选方案2,代码简洁易维护
- 中等数据集:方案1稳定可靠,逻辑清晰
- 超大数据集:方案3性能最优,运算速度远超前两者
内容的提问来源于stack exchange,提问作者heresthebuzz
相关产品推荐
相关产品推荐

