我有一列名为“结果”的列,它包含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行的较小数据集,这不是问题。
答案 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 }}降序排列。