Pandas: количество_значений во фрейме данных - PullRequest
0 голосов
/ 14 июля 2020

У меня есть следующая таблица:

a       b        c       d       e
1       0        1       0       0
0       1        0       1       1
0       0        0       1       1
1       0        0       1       1
0       0        0       1       1

Мне нужно преобразовать эту таблицу, чтобы для каждого столбца я получал количество нулей и единиц. Мне нужна следующая таблица:

fields    count_1     count_0
------------------------------
a          2           3
b          1           4
c          1           4
d          4           1
e          4           1

Я знаю, что если я использую value_counts (), я верну для себя счетчик каждого значения. Однако я действительно не знаю, как создать эту таблицу. Не могли бы вы помочь?

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

Давайте использовать sum и pd.concat:

pd.concat([(df==0).sum().rename('count_0'), df.sum().rename('count_1')], axis=1)

Вывод:

   count_0  count_1
a        3        2
b        4        1
c        4        1
d        1        4
e        1        4

Время

%timeit df.apply(pd.Series.value_counts).transpose().add_prefix('count_')

6,4 мс ± 278 мкс на л oop (среднее ± стандартное отклонение из 7 прогонов, 100 циклов в каждом)

%timeit df.stack().groupby(level=[1]).value_counts().unstack().add_prefix('count_')

2,78 мс ± 69,5 мкс на л oop (среднее ± стандартное .разр. из 7 прогонов, 100 циклов в каждом)

%%timeit
df_out = pd.DataFrame([
    [x.strip() for x in df.columns], sum(df.values == 1), sum(df.values == 0)
]).T
df_out.columns = ['fields', 'count_1', 'count_0']

1,15 мс ± 27,4 мкс на 1 oop (среднее ± стандартное отклонение из 7 прогонов, 1000 циклов в каждом )

%timeit pd.concat([(df==0).sum().rename('count_0'), df.sum().rename('count_1')], axis=1)

1,09 мс ± 9,69 мкс на л oop (среднее ± стандартное отклонение из 7 прогонов, 1000 циклов в каждом)

1 голос
/ 14 июля 2020

попробуйте это,

import pandas as pd

df = pd.DataFrame([
    [x.strip() for x in df.columns], sum(df.values == 1), sum(df.values == 0)
]).T

df.columns = ['fields', 'count_1', 'count_0']

  fields count_1 count_0
0      a       2       3
1      b       1       4
2      c       1       4
3      d       4       1
4      e       4       1
1 голос
/ 14 июля 2020

Давайте попробуем применить по столбцам value_counts:

df.apply(pd.Series.value_counts).transpose().add_prefix('count_')

   count_0  count_1
a        3        2
b        4        1
c        4        1
d        1        4
e        1        4

Или, аналогично, используя stack и unstack:

df.stack().groupby(level=[1]).value_counts().unstack().add_prefix('count_')

   count_0  count_1
a        3        2
b        4        1
c        4        1
d        1        4
e        1        4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...