python-两组伪变量之间的频率/列联表
分类:Python
本文来自 codeday ,作者 codeday
我有一个调查结果的数据框;每个问题一列,每个受访者一行. Q1和Q2是多项选择题,并以伪变量样式编码,每个选项一列.例如.:
d=pd.DataFrame({
'Q1a':[0,0,0,1,1,0,1,1],
'Q1b':[1,1,1,1,1,1,1,1],
'Q1c':[1,0,0,0,0,1,1,0],
'Q1d':[0,1,1,0,1,1,0,0],
'Q2a':[1,1,1,0,0,0,0,0],
'Q2b':[0,1,1,0,0,1,1,0],
'Q2c':[1,0,1,1,1,1,0,1]
})
print d
Q1a Q1b Q1c Q1d Q2a Q2b Q2c
0 0 1 1 0 1 0 1
1 0 1 0 1 1 1 0
2 0 1 0 1 1 1 1
3 1 1 0 0 0 0 1
4 1 1 0 1 0 0 1
5 0 1 1 1 0 1 1
6 1 1 1 0 0 1 0
7 1 1 0 0 0 0 1
因此,此示例有8个受访者,第一季度有4个选项,第二季度有3个选项.
我需要一个频率表,显示在第一季度和第二季度中每个对组合打钩的“是”的受访者数量(或百分比):
Q2a Q2b Q2c
Q1a 0 1 3
Q1b 3 4 6
Q1c 1 2 2
Q1d 2 3 3
因此,有6位受访者对Q1b和Q2c表示同意.
从概念上讲,
import pandas as pd
pd.value_counts(
rows = (d['Q1a'],d['Q1b'],d['Q1c'],d['Q1d']),
columns = (d['Q2a'],d['Q2b'],d['Q2c'])
)
我是否缺少一些显而易见的东西?感觉就像我在,但我看不到它.我已经搜索过,却没有找到专门解决此问题的地方. Python / pandas是理想的选择,但R也可以.
最佳答案
您可以使用点积:
d.loc[:, d.columns.str.startswith('Q1')].T.dot(d.loc[:, d.columns.str.startswith('Q2')])
Out:
Q2a Q2b Q2c
Q1a 0 1 3
Q1b 3 4 6
Q1c 1 2 2
Q1d 2 3 3
d.loc [:, d.columns.str.startswith(‘Q1’)]和d.loc [:, d.columns.str.startswith(‘Q2′)]部分基本上选择了列.使用d.filter(like =’Q1’)可能更清楚,如下:
d.filter(like='Q1').T.dot(d.filter(like='Q2'))
如果要任意选择列,则只需传递一个列名列表即可.相当于上面的是
d.loc[:, ['Q1a', 'Q1b', 'Q1c', 'Q1d']].T.dot(d.loc[:, ['Q2a', 'Q2b', 'Q2c']])