在Pandas中使用apply时为value_counts传递参数的问题
在DataFrame.apply中为value_counts传递dropna=False参数的正确写法
问题分析
你的代码报错是因为两个关键错误:
- 参数名写错:把
dropna=False误写成了value_counts=False,属于笔误; - 方法传递方式错误:
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
相关产品推荐
相关产品推荐

