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

如何用df.apply(pd.value_counts)对DataFrame列归一化返回百分比?

解决0/1分类DataFrame列占比计算的问题

嘿,这个问题我之前也踩过坑,来给你拆解清楚!

为什么df.apply(pd.value_counts(normalize=True))会报错?

你遇到的错误'value_counts() missing 1 required positional argument: 'values',核心原因是你在传递给apply的时候,直接调用了函数,而不是传递函数对象加参数。

pd.value_counts是一个独立的顶层函数,它需要第一个参数是要统计的数值(比如Series或数组)。当你写pd.value_counts(normalize=True)时,Python会立刻尝试执行这个函数,但此时你没有传入要统计的数据(也就是values参数),所以直接抛出缺少参数的错误。

而你单独用pd.Series.value_counts()能工作,是因为这是Series对象的方法——调用时,Series本身会自动作为self参数传入方法内部,不需要你显式传递数据。

正确的实现方式

方法1:用lambda包装Series的value_counts方法

既然每一列都是Series,我们可以用lambda函数把每一列传给它的value_counts方法,同时指定normalize=True参数:

import pandas as pd

# 假设你的0/1 DataFrame是df
normalized_counts = df.apply(lambda col: col.value_counts(normalize=True))

这样就能得到每列0和1的归一化占比了,结果会是一个新的DataFrame,行是0/1,列是原DataFrame的列名。

方法2:针对0/1数据的高效捷径

因为你的数据只有0和1,完全不需要用value_counts,直接计算每列1的占比(用mean(),因为1的均值就是1的占比),0的占比就是1减去这个值,这样速度快得多,尤其是数据量大的时候:

# 计算每列1的占比
proportion_1 = df.mean()
# 计算每列0的占比
proportion_0 = 1 - proportion_1

# 整理成适合堆叠柱状图的格式(行是0/1,列是原列名)
stacked_proportions = pd.DataFrame({'0': proportion_0, '1': proportion_1}).T

绘制堆叠柱状图

拿到归一化占比后,用pandas自带的绘图功能就能轻松画出堆叠柱状图:

import matplotlib.pyplot as plt

stacked_proportions.plot(kind='bar', stacked=True, figsize=(10,6))
plt.title('Normalized Proportions of 0/1 by Column')
plt.xlabel('Category (0/1)')
plt.ylabel('Proportion')
plt.legend(title='Columns')
plt.show()

总结

  • 避免直接在apply里调用函数,要传递函数对象(或用lambda包装带参数的方法调用)
  • 针对二元分类数据,用mean()计算占比是最高效的方式,比value_counts快很多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:01:02