panda 的 value_counts() 方法对缺失值的计数不一致

问题描述 投票:0回答:1

请考虑这个简单的数据框:

df = pd.DataFrame({'x': [1, 2, 3, 4, 10]}, index = range(5))

df:
    x
0   1
1   2
2   3
3   4
4   10

部分指标:

ff_idx = [1, 2]

sd_idx= [3, 4]

根据上述索引过滤 df 创建新列的一种方法:

df['ff_sd_indicator'] = np.nan
df['ff_sd_indicator'][df.index.isin(ff_idx)] = 'ff_count' 
df['ff_sd_indicator'][df.index.isin(sd_idx)] = 'sd_count' 

做同样事情的另一种方法:

df['ff_sd_indicator2'] = np.select([df.index.isin(ff_idx) , df.index.isin(sd_idx)], ['ff_count','sd_count' ], default=np.nan)

请注意,虽然

ff_sd_indicator
ff_sd_indicator2
的值自然相同,但缺失值的打印方式不同(NaN 与 nan):

df: 

    x   ff_sd_indicator ff_sd_indicator2
0   1   NaN         nan
1   2   ff_count    ff_count
2   3   ff_count    ff_count
3   4   sd_count    sd_count
4   10  sd_count    sd_count

我不关心不同的打印结果,但令人惊讶的是缺失值没有出现在以下输出中:

df['ff_sd_indicator'].value_counts()

即:

ff_sd_indicator
ff_count    2
sd_count    2

但它们确实出现在以下输出中:

df['ff_sd_indicator2'].value_counts()

即:

ff_sd_indicator2
ff_count    2
sd_count    2
nan         1

那么,value_counts() 没有计算

ff_sd_indicator
中的缺失值,而它们是由与
ff_sd_indicator2
中的缺失值相同的 np.nan 创建的,这是怎么回事?

python-3.x pandas numpy
1个回答
0
投票

如果您检查以下输出:

np.select([df.index.isin(ff_idx) , df.index.isin(sd_idx)], ['ff_count','sd_count' ], default=np.nan)

你会看到你没有 NaN,而是一个字符串:

array(['nan', 'ff_count', 'ff_count', 'sd_count', 'sd_count'],
      dtype='<U32')

默认情况下

value_counts
会删除 NaN:

df['ff_sd_indicator'].value_counts(dropna=False)

ff_sd_indicator
ff_count    2
sd_count    2
NaN         1
Name: count, dtype: int64
© www.soinside.com 2019 - 2024. All rights reserved.