Конкатенация кросс-таблиц разных переменных - PullRequest
0 голосов
/ 22 октября 2018

У меня есть Pandas (0.23.4) DataFrame с несколькими категориальными столбцами.

df = pd.DataFrame(np.random.choice([True, False, np.nan], (6,4)), columns = ['a','b','c','d'])

     a    b    c    d
0  NaN  1.0  NaN  NaN
1  NaN  1.0  NaN  0.0
2  1.0  NaN  1.0  NaN
3  0.0  NaN  0.0  1.0
4  NaN  1.0  NaN  NaN
5  NaN  1.0  0.0  1.0

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

cross_cols = ['a', 'b']
type_cols = ['c', 'd']

Я хотел бы получитьперекрестная таблица значений каждой переменной cross_col с каждой переменной type_col (a с c и d и b с c и d), исключая NaN, все отображаются рядом друг с другом,Желаемый результат:

         c             d        
       0.0  1.0  All 0.0 1.0 All
a 0.0  0    0    0     1   1   2
  1.0  2    1    3     1   0   1
  All  2    1    3     2   1   3
b 0.0  0    0    0     0   1   1
  1.0  2    1    3     2   0   2
  All  2    1    3     2   1   3

Обратите внимание, что меня не интересуют подсчеты для различных комбинаций a и b или c и d, что я и получаюизменив параметры index и columns на pd.crosstab.

В настоящее время я использую следующий код:

cross_rows = []
for col in cross_cols:
    cross_rows.append(pd.concat([pd.crosstab(df[col], df[type_var],margins=True) for type_var in type_cols],axis=1,keys = type_cols,sort=True))
results = pd.concat(cross_rows, keys = cross_cols,sort=True)

Это дает следующий результат:

         c             d        
c      0.0  1.0  All 0.0 1.0 All
a 1.0  2.0  1.0  3.0   1   0   1
  All  2.0  1.0  3.0   2   1   3
  0.0  NaN  NaN  NaN   1   1   2
b 1.0  2.0  1.0  3.0   2   0   2
  All  2.0  1.0  3.0   2   1   3
  0.0  NaN  NaN  NaN   0   1   1

Результат в порядке, но код медленный инемного некрасивоЯ подозреваю, что есть более быстрый и более питонический подход.Есть ли один вызов функции, который мог бы выполнить работу, или другое более быстрое решение?

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