У меня есть 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
Результат в порядке, но код медленный инемного некрасивоЯ подозреваю, что есть более быстрый и более питонический подход.Есть ли один вызов функции, который мог бы выполнить работу, или другое более быстрое решение?