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

如何用Pandas计算前n行value_counts()的均值并生成新列

生成累计value_counts均值列

你可以通过向量化操作高效实现需求,无需循环,避免大数据量下的性能问题。核心思路是:value_counts()的均值等价于「累计行数」除以「累计唯一值数量」(因为value_counts()的和就是累计行数,均值=总和/唯一值个数)。

实现代码

import pandas as pd

data = [["2022-11-1", 'Tom'], ["2022-11-2", 'Mike'], ["2022-11-3", 'Paul'], ["2022-11-4", 'Pauline'], ["2022-11-5", 'Pauline'], ["2022-11-6", 'Mike'], ["2022-11-7", 'Tom'], ["2022-11-8", 'Louise'], ["2022-11-9", 'Tom'], ["2022-11-10", 'Mike'], ["2022-11-11", 'Paul'], ["2022-11-12", 'Pauline'], ["2022-11-13", 'Pauline'], ["2022-11-14", 'Mike'], ["2022-11-15", 'Tom'], ["2022-11-16", 'Louise']]
df = pd.DataFrame(data, columns=['Date', 'Name'])

# 计算到当前行为止的唯一名称数量
df['Unique_Count'] = (~df['Name'].duplicated(keep='first')).cumsum()
# 计算Mean列:累计行数(索引+1)除以唯一值数量
df['Mean'] = (df.index + 1) / df['Unique_Count']

# 验证你提到的1.25
print(df.loc[4, 'Mean'])  # 输出1.25,对应示例中的目标值

逻辑解释

  1. ~df['Name'].duplicated(keep='first'):标记每个名称的首次出现(True为首次,False为重复)
  2. .cumsum():累计求和,得到每行对应的「到当前行为止的唯一名称总数」
  3. (df.index + 1) / df['Unique_Count']:累计行数(从1开始计数)除以唯一名称数,等价于value_counts()的均值(因为value_counts()的总和是累计行数,均值=总和/唯一值个数)

验证结果

对于你提到的示例值1.25,对应第5行(索引4):

  • 前5行(索引0-4)的Name为['Tom', 'Mike', 'Paul', 'Pauline', 'Pauline']
  • 唯一名称有4个,累计行数5,均值=5/4=1.25,完全符合需求。

内容的提问来源于stack exchange,提问作者user19783276

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:35:25