请考虑这个简单的数据框:
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 创建的,这是怎么回事?
如果您检查以下输出:
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