如何获取DataFrame中截至每一行的累积value_counts?
如何在Pandas中计算截至每一行的累积value_counts?
嘿,这个需求我刚好处理过!要得到Pandas DataFrame里截至每一行的累积value_counts,有两种实用的方法,我结合你的示例给你拆解清楚。
首先先还原你给出的示例数据:
import pandas as pd df = pd.DataFrame({ 'f1': ['v1', 'v2', 'v3', 'v4'], 'f2': ['a', 'a', 'b', 'c'] })
方法一:向量化操作(高效推荐)
这种方法利用get_dummies和cumsum实现,全程是Pandas的向量化运算,速度非常快,适合大数据量的场景:
# 将f2列的分类值转成哑变量矩阵 dummies = pd.get_dummies(df['f2']) # 计算每一行的累积求和,得到截至当前行的各值计数 cumulative_counts = dummies.cumsum() # 把每一行的计数转成字典,只保留计数大于0的项(避免出现0值的键) df['cumulative_value_counts'] = cumulative_counts.apply(lambda x: x[x > 0].to_dict(), axis=1)
运行后你的DataFrame会变成这样:
| f1 | f2 | cumulative_value_counts |
|---|---|---|
| v1 | a | {'a': 1} |
| v2 | a | {'a': 2} |
| v3 | b | {'a': 2, 'b': 1} |
| v4 | c | {'a': 2, 'b': 1, 'c': 1} |
方法二:逐行遍历(直观易懂)
如果你的数据量不大,或者想要更直观的逻辑,可以用逐行遍历的方式,维护一个计数器字典:
from collections import defaultdict # 初始化一个默认字典来存计数 counts = defaultdict(int) cumulative_dicts = [] # 逐行遍历DataFrame for _, row in df.iterrows(): # 更新当前值的计数 counts[row['f2']] += 1 # 必须复制字典,否则后续修改会影响已经存入列表的结果 cumulative_dicts.append(counts.copy()) # 将结果列加入原DataFrame df['cumulative_value_counts'] = cumulative_dicts
这个方法的逻辑非常直白:每过一行就把当前f2的值计数加1,然后把当前的计数状态存下来,完全符合你要的“截至每一行”的累积效果。
两种方法对比
- 优先选方法一:向量化运算没有循环开销,在数据量较大(比如几万行以上)时速度优势非常明显。
- 选方法二:逻辑简单易懂,适合小数据量场景,或者需要在遍历过程中做额外操作的情况。
内容的提问来源于stack exchange,提问作者mkmostafa
相关产品推荐
相关产品推荐

