python, подсчитать уникальные значения списка внутри фрейма данных - PullRequest
2 голосов
/ 07 августа 2020

У меня есть фрейм данных, который содержит два столбца отзывов пользователей.

Первый столбец взят из ответа с множественным выбором в опросе. В каждой строке столбца находится список выбранных ими ответов.

следующий столбец - категория возрастного диапазона. поэтому одна строка будет содержать список цветовых предпочтений пользователей и возрастной диапазон.

например,

what colours do you like?         age
['yellow','orange','green']       18-25
['yellow']                        18-25
['blue','green','red','orange']   26-30
['blue','red']                    26-30

Я хочу получить индивидуальные подсчеты для каждого цвета в списке, а затем разделить по возрастному диапазону желаемый результат:

age    colour   count
18-25  yellow     2
18-25  orange     1
18-25  green      1
26-30  blue       2
26-30  green      1
26-30  red        2
26-30  orange     1

заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 07 августа 2020

Установите индекс фрейма данных как age, затем используйте Series.explode в столбце what colours do you like?', затем используйте groupby в level=0 и агрегируйте ряд, используя value_counts:

df1 = (
    df.set_index('age')['what colours do you like?'].explode()
    .rename('color').groupby(level=0).value_counts().reset_index(name='count')
)

Результат:

print(df1)
     age   color  count
0  18-25  yellow      2
1  18-25   green      1
2  18-25  orange      1
3  26-30    blue      2
4  26-30     red      2
5  26-30   green      1
6  26-30  orange      1
0 голосов
/ 07 августа 2020

Другой вариант:

df1 = df.apply(lambda x: [str(x[0][i]) + " " + str(x[1]) for i in range(len(x[0]))], axis = 1).agg("sum")
df1 = pd.DataFrame(np.unique(df1, return_counts = True), index = ["A","count"]).T
df1[["colour","age"]] = df1.A.str.split(expand = True)
df1 = df1.drop("A")

Должен вывести:

df1

   count   age   color  
0      2 18-25  yellow  
1      1 18-25   green  
2      1 18-25  orange  
3      2 26-30    blue  
4      2 26-30     red  
5      1 26-30   green  
6      1 26-30  orange  
...