如何用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,对应示例中的目标值
逻辑解释
~df['Name'].duplicated(keep='first'):标记每个名称的首次出现(True为首次,False为重复).cumsum():累计求和,得到每行对应的「到当前行为止的唯一名称总数」(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
相关产品推荐
相关产品推荐

