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

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

Мой (упрощенный) фрейм данных выглядит так:

source    text              sent
--------------------------------
bar       some string       0.13
foo       alt string        -0.8
bar       another str       0.7
foo       some text         -0.2
foo       more text         -0.5

Вывод из этого должен быть примерно таким:

source    count     mean_sent
-----------------------------
foo       3         -0.5
bar       2         0.415

Ответ где-то вроде:

df['sent'].groupby(df['source']).mean()

Но только дает каждый источник, и это значит, без заголовков столбцов.

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

21
Lewis Anderson 8 Дек 2016 в 15:58

4 ответа

Лучший ответ

Вы можете использовать groupby с aggregate :

df = df.groupby('source') \
       .agg({'text':'size', 'sent':'mean'}) \
       .rename(columns={'text':'count','sent':'mean_sent'}) \
       .reset_index()
print (df)
  source  count  mean_sent
0    bar      2      0.415
1    foo      3     -0.500
22
jezrael 8 Дек 2016 в 13:00

В новых версиях Panda вам больше не нужно переименовывать, если используются именованные параметры:

df = df.groupby('source') \
       .agg(count=('text', 'size'), mean_sent=('sent', 'mean')) \
       .reset_index()

print (df)
  source  count  mean_sent
0    bar      2      0.415
1    foo      3     -0.500
6
neves 17 Окт 2019 в 03:22

Ниже должно работать нормально:

DF [ [ ' источник ', ' послан '] ] . GroupBy ( ' исходный ') . AGG ( [ ' подсчет ', ' средний '] )

1
Ojha 20 Янв 2020 в 04:12

Я думаю, что это должно обеспечить вывод, который вы хотели:

result = pd.DataFrame(df.groupby('source').size())

results['mean_score'] = df.groupby('source').sent.mean()

-1
galitbw 8 Дек 2016 в 13:31