如何根据另一列

时间:2018-06-07 19:52:17

标签: python pandas dataframe merge

所以我有一个包含列' body'的pandas数据框。和' tag_text'。正文是一些文本,而tag_text是给予该文本的标记。数据框的结构如下

  • 每个机构只有一个标签,
  • 具有多个标签的主体由数据框中该主体的重复条目表示,每个条目具有不同的tag_text值。

例:
body,tag_text
"嗨","问候"
"嗨","英语"
" adios","告别"
" adios","西班牙语"

所以,我的问题是如何有效地创建一个新的数据帧:

  • 每个正文仅在数据框中出现一次
  • 每个正文的tag_text字段现在是一个包含与该正文相对应的所有标记的标记列表。

例:
body,tag_text
"嗨",["问候","英语"]
" adios",["告别","西班牙语"]
这是我快速而肮脏的方式,但效率很低。所以,如果人们有更好的想法,我会感兴趣。

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 :(得分:2)

您可以使用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]