两组虚拟变量

时间:2017-09-23 16:16:54

标签: python r pandas

我有调查结果的数据框;每个问题一列,每个受访者一行。 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也可以。

1 个答案:

答案 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']])