Подсчитать голоса опроса по ответу - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю с опросом относительно дохода.У меня есть такие данные:

   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

Я хочу сгруппировать по ответу и по стране.Например, давайте подумаем, что Опрос2 относится к числу автомобилей респондента, я хочу знать количество людей, которым принадлежит одна машина в определенной стране.

Ожидаемый результат будет следующим:

   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, но я не нашел способ подсчета ответов для конкретной страны.

   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 голосов
/ 12 февраля 2019

Я бы сделал это с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...