Разблокирование мультииндексного Pandas DataFrame с сохранением тех же столбцов - PullRequest
0 голосов
/ 05 февраля 2019

В настоящее время я пытаюсь извлечь текстовые данные из определенного столбца во фрейме данных и сохранить его в новом фрейме данных.Используя следующий фрагмент кода, я могу извлечь нужные мне шаблоны, но я не могу понять, как отформатировать его так, как мне нравится.Мой текущий фрейм данных имеет мультииндекс и четыре столбца, как показано ниже.В кадре данных есть от нуля до четырех имен игроков, соответствующих каждому индексу, и я бы хотел, чтобы они все были в одном ряду.В каждом случае, когда есть несколько строк, соответствующих индексу, в первом ряду есть пустая ячейка над именем игрока, которое находится во втором, и я просто хотел бы объединить эти строки и заменить пробелы в первом ряду наимена игроков (если есть) прямо под ними.Есть ли способ, которым я мог бы сделать это?Любая помощь с этим будет принята с благодарностью.

regex_df = play_by_play_df['Play'].str.extractall(r'(\. )(.+?)( scored)|(.+?)( homered)|(.+?)( balked to score)|(.+?)( advanced on a wild pitch to score)|(.+?)( advanced on error to score)')[[1,3,5,7,9]].unstack(level='match').stack(level=0)

Это вывод этой строки кода.

match                0                1     2     3
2   1    Jason Heyward             None  None  None
13  1      Kolten Wong             None  None  None
38  1   Matt Carpenter             None  None  None
91  3      JD Martinez             None  None  None
94  1              NaN  Yoenis Cespedes  None  None
    3       Alex Avila              NaN  None  None
127 1  Yoenis Cespedes             None  None  None

Это то, что я хотел бы, чтобы мой фрейм данных выглядел.

This is my desired output

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

    Play
2   Matt Holliday singled to right (Liner). Jason Heyward scored.
91  JD Martinez homered (Fly).
256 Lorenzo Cain advanced on a wild pitch to score.
331 Billy Hamilton balked to score. Joey Votto advanced to 2B.
8378 Nick Hundley advanced on error to score. DJ LeMahieu advanced to 2B on error. Error by Chris Heston.

Я хотел бы добавить четыре дополнительных столбца к этому фрейму данных, каждый из которых содержит имя игрока, котороеЗабил (может быть не более четырех игроков, выигравших в данной игре).Очевидно, будет много пустых ячеек, потому что в одной игре редко участвуют четыре игрока.

1 Ответ

0 голосов
/ 06 февраля 2019

Я очень ценю всю помощь, ребята!Извините, если мой вопрос был задан плохо.После некоторого копания я наконец исправил свою проблему.Решение было разочаровывающе простым.

regex_df = play_by_play_df['Play'].str.extractall(r'(\. )(.+?)( scored)|(.+?)( homered)|(.+?)( balked to score)|(.+?)( advanced on a wild pitch to score)|(.+?)( advanced on error to score)')[[1,3,5,7,9]].unstack(level='match').stack(level=0).reset_index(level=1, drop=True)
regex_df = regex_df.groupby(regex_df.index).first()

Все, что я в итоге сделал, - это отбросил первый уровень мультииндекса, сделав так, чтобы было несколько строк с одинаковым индексом.Оттуда я просто использовал groupby (). First (), чтобы сгруппировать по индексу и принудительно ввести значения не-NaN в верхнюю строку.Мой результат выглядит так:

enter image description here

...