用答案计算调查的票数

时间:2019-02-12 06:04:54

标签: python python-3.x pandas dataframe

我正在从事一项有关收入的调查。我有这样的数据:

   form  Survey1  Survey2  Country
0     1        1        1        1
1     2        1        2        5
2     3        2        2        4
3     4        2        1        1
4     5        2        2        4

我想按答案和国家分组。例如,让我们认为Survey2指的是受访者的汽车数量,我想知道某个国家/地区拥有一辆汽车的人数。

预期输出如下:

   Country  Survey1_1  Survey1_2  Survey2_1  Survey2_2
0        1          1          1          2          0
1        4          0          2          0          2
2        5          1          0          0          1

在这里我添加了'_#',其中#是要计数的答案。

直到现在,我已经创建了一个代码来为每一列找到不同的答案,并且我已经计算出了可以回答的答案,比方说1,但是我还没有建立计算特定国家/地区答案的方法。 / p>

   number_unic = df.head().iloc[:,j+ci].nunique() # count unique                                          answers
    val_unic = list(df.iloc[:,column].unique()) # unique answers
    for i in range(len(vals_unic)):
        names = str(df.columns[j+ci]+'_' + str(vals[i])) #names of columns
        count = (df.iloc[:,j+ci]==vals[i]).sum() #here I                                        count the values that are equal to an unique answer        
        df.insert(len(df.columns.values),names, count) # to insert new columns 

1 个答案:

答案 0 :(得分:2)

我会用pivot_table来做到这一点:

In [11]: df.pivot_table(["Survey1", "Survey2"], ["Country"], df.groupby("Country").cumcount())
Out[11]:
        Survey1      Survey2
              0    1       0    1
Country
1           1.0  2.0     1.0  1.0
4           2.0  2.0     2.0  2.0
5           1.0  NaN     2.0  NaN

要获得所需的输出,可以执行以下操作:

In [21]: res = df.pivot_table(["Survey1", "Survey2"], ["Country"], df.groupby("Country").cumcount())

In [22]: res.columns = [s + "_" + str(n + 1) for s, n in res.columns.values]

In [23]: res
Out[23]:
         Survey1_1  Survey1_2  Survey2_1  Survey2_2
Country
1              1.0        2.0        1.0        1.0
4              2.0        2.0        2.0        2.0
5              1.0        NaN        2.0        NaN

但是,通常最好在这里使用MultiIndex ...


要计算每个响应的数量,您可以执行以下更为复杂的groupby和value_count:

In [31]: df1 = df.set_index("Country")[["Survey1", "Survey2"]]  # more columns work fine here

In [32]: df1.unstack().groupby(level=[0, 1]).value_counts().unstack(level=0, fill_value=0).unstack(fill_value=0)
Out[32]:
        Survey1    Survey2
              1  2       1  2
Country
1             1  1       2  0
4             0  2       0  2
5             1  0       0  1