首页 > 解决方案 > 如何摆脱 Series.value_counts 中的 0 和 NaN?

问题描述

如果有一个包含几列的 df,其中单元格值可以是 0、1、3、4、5 以及 nan。

第 2 栏:

[4, 4, 3, 2, 4, 4, 5, 2, 4, 3, 2, 3, 2, 5, 3, 2, 3, 3, 3, 2, 2, 3, 4, 3, 5, 5, 5, 4, 5, 4, 2, 4, 2, 5, 4, 3, 1, 4, 4, 3, 3, 5, 3, 3, 3, 5, 3, 5, 4, 3, 5, 4, 4, 5, 4, 2, 1, 4, 3, 5, 4, 0, 0]

第 3 栏

[4, 4, 5, 4, 5, 4, 5, 5, 5, 4, 3, 4, 5, 4, 4, 3, 5, 5, 5, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 4, 5, 3, 5, 4, 4, 2, 5, 4, 4, 5, 5, 5, 5, 4, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 4, 3, 5, 0, 0]

我想创建一个表,为我提供每一行的值计数。这就是我所做的:

df.apply(pd.Series.value_counts). reset_index() 

我不想计算 0 和 NaN,我该怎么办?另外,我可以得到百分比而不是数字吗?

我尝试在括号中添加 dropna=True 和 normalize=True ,导致此错误消息:

value_counts() missing 1 required positional argument: 'self'

这可能是达到我想要的输出的另一种方法,但仍需要过滤 0 和 NaN:

df1 = (df.melt('column1')
         .pivot_table(index='variable',
                      columns='value',
                      aggfunc='size',
                    )   
         .rename_axis(index=None, columns=None))

标签: pythonpandas

解决方案


我相信您需要替换0NaNs 并value_counts使用normalize=Trueper axis=0

df1 = df.replace(0, np.nan).apply(pd.value_counts, normalize=True)

如果需要的话axis=1

df2 = df.replace(0, np.nan).apply(pd.value_counts, normalize=True, axis=1)

推荐阅读