Группа Pandas Dataframe по столбцу со списком

Я использую ноутбуки jupyter, мой текущий фрейм данных выглядит следующим образом:

players_mentioned  |  tweet_text    |  polarity
______________________________________________
[Mane, Salah]      |  xyz           |    0.12
[Salah]            |  asd           |    0.06

Как я могу сгруппировать всех игроков по отдельности и усреднить их полярность?

В настоящее время я пытался использовать:

df.groupby(df['players_mentioned'].map(tuple))['polarity'].mean()

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

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

 player  | polarity_average
____________________________
  Mane   |   0.12
  Salah  |   0.09

Другими словами, как сгруппировать по каждому элементу в списках в каждой строке.

Ваш предпринятый код даже близко не соответствует тому, что вы пытаетесь сделать. Не могли бы вы объяснить, что вы имеете в виду под «разбить их»? Было бы полезно увидеть ожидаемый результат.

cs95 01.04.2019 22:02

Добавлен ожидаемый результат @coldspeed . Я понимаю, что моя попытка неверна, поэтому мне нужно руководство

user4509002 01.04.2019 22:07

Спасибо, это было полезно.

cs95 01.04.2019 22:16

Не могли бы вы запустить result.loc[result['players_mentioned'].str.contains('Alderwe‌​ireld'), 'players_mentioned'].tolist() результирующий df из моего кода и сказать мне, каков результат?

cs95 02.04.2019 00:18

Я вижу проблему, в начале имени есть пробел, спасибо

user4509002 02.04.2019 02:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
214
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

df.groupby('players_mentioned').polarity.agg('mean')

Это не дает ожидаемого результата OP.

cs95 01.04.2019 22:16
Ответ принят как подходящий

вы можете использовать unnesting идиома из этого ответа.

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')

Теперь вы можете вызвать groupby в невложенном столбце «упомянутые игроки».

(unnesting(df, ['players_mentioned'])
    .groupby('players_mentioned', as_index=False).mean())

  players_mentioned  polarity
0              Mane      0.12
1             Salah      0.09

Большое спасибо! Отлично сработало :)

user4509002 01.04.2019 22:23

Другие вопросы по теме