我有调查结果的数据框;每个问题一列,每个受访者一行。 Q1和Q2是多项选择题,以虚拟变量形式编码,每个选项一列。 E.g:
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个受访者,Q1有4个选项,Q2有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也可以。
答案 0 :(得分:4)
您可以使用点积:
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')
作为@Zero suggests:
d.filter(like='Q1').T.dot(d.filter(like='Q2'))
如果要任意选择列,则只需传递列名列表即可。相当于以上是
d.loc[:, ['Q1a', 'Q1b', 'Q1c', 'Q1d']].T.dot(d.loc[:, ['Q2a', 'Q2b', 'Q2c']])