如何以pandas风格高效处理DataFrame单元格set集合元素并调用函数
实现方案优化
你当前的三层循环写法功能正确,适合小数据量场景下使用,可读性强便于调试。如果需要更高的运行效率或者更简洁的代码,可以参考以下两种优化方案:
方案1:行级apply实现(中等数据量适用)
相比iterrows遍历,apply方法的内部实现性能更高,同时可以把多层循环压缩到一行:
import pandas as pd def my_func(a, b): pass d = {"a": [{1}, {4}], "b": [{1, 2, 3}, {2}]} df = pd.DataFrame(d) # axis=1表示按行遍历,row.name就是当前行的索引 df.apply(lambda row: [my_func(row.name, num) for cell in row for num in cell], axis=1)
方案2:explode拆分行实现(大数据量适用)
pandas 0.25及以上版本支持explode方法,可以直接把集合类型的单元格拆分为单独行,仅需要一层遍历即可完成调用,运行速度最快:
# 先把多列合并为单列,再拆分集合元素为单独行 exploded_series = df.stack().explode().reset_index(level=1, drop=True) # 遍历调用函数,index为原行索引,value为集合中的数字 for idx, num in exploded_series.items(): my_func(idx, num)
选型参考
- 数据量小于1万行:原三层循环写法完全可用,不需要修改
- 数据量1万~100万行:推荐使用方案1,兼顾性能和兼容性
- 数据量大于100万行:推荐使用方案2,性能最优
内容的提问来源于stack exchange,提问作者jss367
相关产品推荐
相关产品推荐

