Как объединить записи фрейма данных одного столбца на основе повторяющихся записей другого - PullRequest
0 голосов
/ 07 июня 2018

Итак, у меня есть pandas-массив данных, содержащий столбцы body и tag_text.Тело - это некоторый текст, а tag_text - это тег, данный этому тексту.Кадр данных организован следующим образом:

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

Пример:
body, tag_text
"привет", "приветствие"
"привет", "английский"
"adios", "прощай"
"adios", "испанский"

Итак, мой вопрос: как мне эффективно создать новый фрейм данных, такой что:

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

Пример:
body, tag_text
"привет", ["приветствие", "английский"]
"адиос", ["прощай", "испанский"]
Вот мой быстрый и грязный способ, но он довольно неэффективен.Поэтому мне было бы интересно, если бы у людей были лучшие идеи.

def mergeTagsByBody(df):
    bodies = df['body']
    unique_bodies = list(set(bodies))   

    unique_tags = []
    for body in unique_bodies:
        body_tags = df[df['body'] == body]['tag_text']
        unique_tags.append(body_tags)

    return pd.DataFrame({'body': unique_bodies, 'tag_text': unique_tags})

1 Ответ

0 голосов
/ 07 июня 2018

Вы можете использовать DataFrame.groupby для этого:

df = pd.DataFrame(
    [["hi", "greeting"], 
     ["hi", "english"], 
     ["adios", "farewell"], 
     ["adios", "spanish"]], 
    columns=["body", "tag_text"]
)

def tags_to_list(g):
    tags = list(g["tag_text"])
    return pd.DataFrame([[g["body"].iloc[0], tags]], columns=["body", "tags"])

(df.groupby("body")
   .apply(tags_to_list)
   .reset_index(drop=True))
#     body                 tags
# 0  adios  [farewell, spanish]
# 1     hi  [greeting, english]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...