Как применить Series.value_counts () на DataFrame? - PullRequest
0 голосов
/ 06 февраля 2019

В DataFrame я хотел бы посчитать значения каждого столбца и использовать значения в качестве индекса.

Я хотел бы включить это:

Q1                   Q2                  Q3
Strongly agree       Agree               Undecided
Undecided            Agree               More or less disagree
Strongly agree       Agree               Undecided
Strongly agree       Strongly Disagree   Disagree
More or less agree   Undecided           Strongly disagree

В это:

                        Q1  Q2  Q3
Strongly agree          3   0   0
Agree                   0   3   0
More or less agree      1   0   0
Undecided               1   1   2
More or less disagree   0   0   1
Disagree                0   0   1
Strongly disagree       0   1   1

Как это возможно с пандами?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете применить функцию pd.Series.value_counts ко всему кадру данных и заполнить NaN значения 0.

df.apply(pd.Series.value_counts,axis=0).fillna(0)
0 голосов
/ 06 февраля 2019

Если вы настаиваете на value_counts, вы можете заранее использовать stack и groupby, а затем позвонить value_counts до unstacking:

df.stack().groupby(level=[1]).value_counts().unstack(0, fill_value=0)

                       Q1  Q2  Q3
Agree                   0   3   0
Disagree                0   0   1
More or less agree      1   0   0
More or less disagree   0   0   1
Strongly Disagree       0   1   0
Strongly agree          3   0   0
Strongly disagree       0   0   1
Undecided               1   1   2

Другой вариант заключается в использованииmelt и pivot_table:

(df.melt()
   .pivot_table(columns='variable', index='value', aggfunc='size', fill_value=0))

variable               Q1  Q2  Q3
value                            
Agree                   0   3   0
Disagree                0   0   1
More or less agree      1   0   0
More or less disagree   0   0   1
Strongly Disagree       0   1   0
Strongly agree          3   0   0
Strongly disagree       0   0   1
Undecided               1   1   2

Решение с использованием crosstab:

v = df.melt()
pd.crosstab(v['value'], v['variable'])

variable               Q1  Q2  Q3
value                            
Agree                   0   3   0
Disagree                0   0   1
More or less agree      1   0   0
More or less disagree   0   0   1
Strongly Disagree       0   1   0
Strongly agree          3   0   0
Strongly disagree       0   0   1
Undecided               1   1   2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...