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

在Pandas中使用apply时为value_counts传递参数的问题

在DataFrame.apply中为value_counts传递dropna=False参数的正确写法

问题分析

你的代码报错是因为两个关键错误:

  1. 参数名写错:把dropna=False误写成了value_counts=False,属于笔误;
  2. 方法传递方式错误:apply需要接收可调用对象(函数/方法),而你直接执行了pd.Series.value_counts(...),导致方法提前执行而非传给apply遍历每个Series时调用。

正确写法

方法1:用lambda函数包装(最常用)

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,2,2,np.nan], 'b':[2,3,4,3], 'c': [4,np.nan,6,4]})
# 用lambda为每个Series的value_counts传递dropna=False参数
print(df.apply(lambda s: s.value_counts(dropna=False)))

执行后输出会包含NaN的计数:

a    b    c
1.0  1.0  NaN  NaN
2.0  2.0  1.0  NaN
3.0  NaN  2.0  NaN
4.0  NaN  1.0  2.0
6.0  NaN  NaN  1.0
NaN  1.0  NaN  1.0

方法2:用functools.partial绑定参数(适合复用场景)

如果需要多次使用带dropna=False的value_counts,可以用partial预先绑定参数:

from functools import partial
import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,2,2,np.nan], 'b':[2,3,4,3], 'c': [4,np.nan,6,4]})
# 预先绑定dropna=False参数
vc_dropna_false = partial(pd.Series.value_counts, dropna=False)
print(df.apply(vc_dropna_false))

这个写法和lambda的效果完全一致,适合参数较多或需要复用的场景。

错误代码的问题拆解

你原来的代码df.apply(pd.Series.value_counts(value_counts=False)):

  • 第一错:value_counts不是value_counts方法的参数,正确参数是dropna,用来控制是否忽略NaN;
  • 第二错:pd.Series.value_counts(...)会直接尝试执行方法(此时没有传入具体的Series对象,必然报错),而apply需要的是“待执行的方法”,而非方法执行后的结果。用lambda或partial包装后,才能让apply在遍历每个列Series时,再调用带参数的value_counts。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:30:56