多嵌套列表共有元素数值百分比变化计算及Pandas优化方案
用Pandas高效处理嵌套列表的公共元素百分比变化计算
针对你的问题,用Pandas的向量化操作可以大幅提升效率,比手动遍历快得多,具体实现步骤如下:
步骤1:导入Pandas并转换数据格式
先把嵌套列表转换成Pandas的DataFrame,让字符串首元素作为索引,每个子列表对应一列数值:
import pandas as pd really_big_list = [ [["A",1], ["B",2], ["C",3]], [["A",2], ["G",2], ["C", 5]], [["A", 2], ["B", 5], ["D", 3]] ] # 将每个子列表转为Series,索引为字符串首元素,值为对应数值 series_list = [] for sublist in really_big_list: # 拆分每个子列表的键和值 keys = [item[0] for item in sublist] values = [item[1] for item in sublist] series_list.append(pd.Series(values, index=keys)) # 合并所有Series为DataFrame,列对应原嵌套列表的层级 df = pd.concat(series_list, axis=1)
步骤2:筛选所有子列表共有的元素
DataFrame中缺失值代表该元素在对应子列表中不存在,直接用dropna()筛选出无缺失值的行(即所有子列表都存在的元素):
# 筛选公共元素 common_elements = df.dropna()
示例数据中,公共元素只有"A",得到的common_elements如下:
0 1 2 A 1.0 2.0 2.0
步骤3:计算百分比变化
Pandas内置了pct_change()方法可以直接计算变化率,也可以手动计算相对于基准的百分比变化:
方式1:计算相邻子列表间的百分比变化
# 按列计算相邻变化率,结果为小数(如1.0代表100%) pct_changes = common_elements.pct_change(axis=1)
示例结果:
0 1 2 A NaN 1.0 0.0
NaN是因为第一列没有前序数据,1.0代表从第一个子列表到第二个子列表数值翻倍(100%增长),0.0代表第二个到第三个子列表数值无变化。
方式2:以第一个子列表为基准计算百分比变化
如果需要统一以第一个子列表的数值为基准,直接做除法运算:
# 计算相对于第一个子列表的百分比变化,转为百分比形式 base_pct_changes = (common_elements / common_elements.iloc[:, 0] - 1) * 100
示例结果:
0 1 2 A 0.0 100.0 100.0
代表"A"在第二个子列表中比第一个增长100%,第三个和第一个相比同样增长100%。
效率优势
Pandas的核心操作都是底层C实现的向量化运算,避免了Python循环的开销,数据量越大,和手动遍历的效率差距越明显,处理百万级数据也能快速完成。
内容的提问来源于stack exchange,提问作者Jorge Gill
相关产品推荐
相关产品推荐

