簡體   English   中英

在 pandas 中創建兩列的並集

[英]Create union of two columns in pandas

我有兩個具有相同列的數據框。 但是,“標簽”列可以有不同的標簽。 所有標簽都是逗號分隔的字符串。 我想在標簽上建立一個聯合,以便從這里得到 go:

df1:

    id1   id2 labels language
0   1     1   1      en
1   2     3          en
2   3     4   4      en
3   4     5          en
4   5     6          en

df2:

    id1   id2 labels language
0   1     1   1,2    en
1   2     3          en
2   3     4   5,7    en
3   4     5          en
4   5     6   3      en

對此:

    id1   id2 labels language
0   1     1   1,2    en
1   2     3          en
2   3     4   4,5,7  en
3   4     5          en
4   5     6   3      en

我試過這個:

df1['labels'] = df1['labels'].apply(lambda x: set(str(x).split(',')))
df2['labels'] = df2['labels'].apply(lambda x: set(str(x).split(',')))
result = df1.merge(df2, on=['article_id', 'line_number', 'language'], how='outer')

result['labels'] = result[['labels_x', 'labels_y']].apply(lambda x: list(set.union(*x)) if None not in x else set(), axis=1)
result['labels'] = result['labels'].apply(lambda x: ','.join(set(x)))
result = result.drop(['labels_x', 'techniques_y'], axis=1)

但我在某些地方得到了一個奇怪的 df 和奇怪的逗號,例如,3 .:

    id1   id2 labels language
0   1     1   1,2    en
1   2     3          en
2   3     4   4,5,7  en
3   4     5          en
4   5     6   ,3     en

如何正確修復逗號? 任何幫助表示贊賞!

這是pandas.merge的可能解決方案:

out = (
        df1.merge(df2, on=["id1", "id2", "language"])
            .assign(labels= lambda x: x.filter(like="label")
                                       .stack().str.split(",")
                                       .explode().drop_duplicates()
                                       .groupby(level=0).agg(",".join))
            .drop(columns=["labels_x", "labels_y"])
             [df1.columns]
      )

Output:

print(out)

  id1 id2 labels language
0   1   1    1,2       en
1   2   3    NaN       en
2   3   4  4,5,7       en
3   4   5    NaN       en
4   5   6      3       en

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM