Панды, возвращающие непоследовательное количество значений столбцов - PullRequest
1 голос
/ 11 июля 2019

У меня есть столбец с именем «results», и он содержит 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 строк. </p>

Ответы [ 3 ]

1 голос
/ 11 июля 2019

values[1] получает индекс 1 (второй элемент), который не может быть 1, здесь это 0, поэтому вам нужно выполнить loc, как в ответе @ WenYoBen, или условие:

>>> vc = df['result'].value_counts()
>>> vc[vc.index.eq(1)].item()
5
>>>
1 голос
/ 11 июля 2019

Хотя @WeNYoBen и @ U10-Forward упомянули правильный способ доступа к значениям, основная причина проблемы заключалась в том, что в меньших наборах данных больше нулей, в то время как в больших наборах данных больше единиц и value_counts()в порядке убывания.

1 голос
/ 11 июля 2019

Что мы обычно делаем, используя .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 отсортировал 1 выше 0

Например

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 счет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...