熊猫返回的列值计数不一致

时间:2019-07-11 01:12:43

标签: python pandas

我有一列名为“结果”的列,它包含1或0。我想获取1和0的数量用于测试目的,但是我得到了一些奇怪的结果。

我最初是这样做的:

df.sort_values(by='results', axis=0, ascending=False, inplace=True) 

然后:

num_ones = df['results'].value_counts().values[1]
num_zeroes = df['results'].value_counts().values[0]
print("num_ones: " + str(num_ones))
print("num_zeroes: " + str(num_zeroes))

输出:

num_ones: 3610
num_zeroes: 51500

马上我看到值被翻转了。 num_ones实际上保​​留0的数目,反之亦然。

然后我做

df1 = df.loc[df['results'] == 1]
print('Ones: ' + str(df1.shape[0]))
df0 = df.loc[df['results'] == 0]
print('zeros: ' + str(df0.shape[0]))

输出:

Ones: 51500
zeros: 3610

,结果正确。是什么原因导致最初的方法不起作用?

我注意到,对于具有<5k行的较小数据集,这不是问题。

3 个答案:

答案 0 :(得分:1)

由于结果在.loc之后变为index,因此我们通常使用value_counts

num_ones = df['results'].value_counts().loc[1]
num_zeroes = df['results'].value_counts().loc[0]
print("num_ones: " + str(num_ones))
print("num_zeroes: " + str(num_zeroes))

由于value_counts默认为sort=True,而您1的计数大于0,因此pandas将0上方的1排序

例如

s=pd.Series([0,1,1]) #assuming it is well sorted
s.value_counts()
Out[4]: 
1    2
0    1
dtype: int64

如果您这样做.value[0]将输出1的计数

答案 1 :(得分:1)

values[1]得到的索引1(第二个元素)可能不是1,这里是0,因此您需要像下面这样进行loc @WenYoBen的答案或条件:

>>> vc = df['result'].value_counts()
>>> vc[vc.index.eq(1)].item()
5
>>>

答案 2 :(得分:1)

虽然@WeNYoBen和@ U10-Forward提到了访问值的正确方法,但问题的主要原因是,在较小的数据集中,存在较多的0,而在较大的数据集中,存在较多的1和{{1 }}降序排列。