You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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会变成这样:

f1f2cumulative_value_counts
v1a{'a': 1}
v2a{'a': 2}
v3b{'a': 2, 'b': 1}
v4c{'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:05:22