Pandas DataFrame列表类型列使用.diff()实现逐元素差分咨询
Pandas列表类型列相邻行差分高效实现方案
实现思路
利用Pandas原生向量化操作替代Python层逐行遍历,核心逻辑是先把存储列表的列拆分为独立的数值列,用原生diff()方法处理差分后再合并回列表结构,所有计算都在Pandas底层C语言层面完成,性能远高于逐行遍历。
前置要求
coll2列每一行的列表长度完全一致coll2内元素、col3列均为可做减法运算的数值类型
完整实现代码
import pandas as pd # 构造测试数据(可替换为自己的DataFrame) df = pd.DataFrame({ 'col1': [1]*5, 'coll2': [ [1,2,3], [4,5,6], [7,8,9], [10,11,12], [13,14,15] ], 'col3': [10,20,30,40,50] }) # 1. 将列表列拆分为独立数值列 expanded_col2 = pd.DataFrame(df['coll2'].tolist(), index=df.index) # 2. 对拆分后的列做相邻行差分,丢弃第一行空值 expanded_col2_diff = expanded_col2.diff().iloc[1:] # 3. 差分后的多列重新合并为列表 coll2_diff = expanded_col2_diff.apply(list, axis=1) # 4. 处理普通数值列的差分 col3_diff = df['col3'].diff().iloc[1:] # 5. 拼接得到最终结果 result = pd.DataFrame({ 'col1': df['col1'].iloc[1:].values, 'coll2': coll2_diff.values, 'col3': col3_diff.values }).reset_index(drop=True) print(result)
特殊场景适配
如果coll2列的列表长度不固定,可以使用优化后的批量推导方案,性能依然远高于逐行遍历:
prev_col2 = df['coll2'].shift(1).iloc[1:] curr_col2 = df['coll2'].iloc[1:] coll2_diff = pd.Series([[c - p for c, p in zip(curr, prev)] for curr, prev in zip(curr_col2, prev_col2)], index=curr_col2.index) # 后续拼接逻辑和上面方案一致
内容的提问来源于stack exchange,提问作者meedz
相关产品推荐
相关产品推荐

