【问题标题】:Pandas Dataframe: Remove duplicate rows and append data to remaining unique rowPandas Dataframe:删除重复行并将数据附加到剩余的唯一行
【发布时间】:2020-10-27 18:07:55
【问题描述】:

我的df结构如下(例如):

根据评论编辑数据

import pandas as pd
    
    
data = {'ID':["abc", "abc", "123", "xyz", "xyz"], 'valid':[["A", "B"], [], [], ["A", "B", "C"], []],
        'not_valid':[[], ["C", "D"], ["A", "B", "C", "D"], [], ["D"]],
       'other_data': ["1", "1", "3", "4", "4"]}

df = pd.DataFrame(data)

这给出了:

ID    valid         not_valid      other_data
abc   [A, B]        []             1
abc   []            [C, D]         1
123   []            [A, B, C, D]   3
xyz   [A, B, C]     []             4
xyz   []            [D]            4

我想要的结果如下:

ID    valid         not_valid      other_data
abc   [A, B]        [C, D]         1
123   []            [A, B, C, D]   3
xyz   [A, B, C]     [D]            4

我想知道如何将每个唯一 ID 的两列 validnot_valid 合并在一起(并非每个 ID 都必须有两个条目,如本例中的 123)。

虽然我可以删除重复项

df.drop_duplicates(subset=['ID']).reset_index()

我显然丢失了重复 ID 的一半数据。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以通过将值转换为集合然后转换为GroupBy.agg 中的列表来展平值:

    cols = ['valid','not_valid']
    df = df.groupby('ID', sort=False)[cols].agg(lambda x: list(set(z for y in x for z in y)))
    print (df)
             valid     not_valid
    ID                          
    abc     [A, B]        [D, C]
    123         []  [A, D, B, C]
    xyz  [A, B, C]           [D]
    

    编辑:如果 ID 每组的其他列的所有值都相同,请使用:

    #grouping by all columns without valid, not_valid
    c = df.columns.difference(['valid','not_valid']).tolist()
    f = lambda x: list(set(z for y in x for z in y))
    df1 = df.groupby(c, sort=False, as_index=False).agg(f).reindex(df.columns, axis=1)
    print (df1)
        ID      valid     not_valid other_data
    0  abc     [A, B]        [D, C]          1
    1  123         []  [A, D, B, C]          3
    2  xyz  [A, B, C]           [D]          4
    

    【讨论】:

    • 你是摇滚!1
    • 谢谢!如何更改仅检查两个有效列的代码?如果 df 中有其他列。
    • @Colle - 如果有更多列,是否可以更改具有预期输出的数据样本 - 例如,如果 2 个新列?
    • @jezrael 我编辑了 OP。基本上,对于所有重复的 ID,除了“valid”和“not_valid”列之外,所有列的值都是相同的。
    • @Colle - yop,所以你可以像df = df.groupby(['ID','other_data'], sort=False).agg(lambda x: list(set(z for y in x for z in y)))一样将所有列传递给groupby?
    猜你喜欢
    • 2020-03-22
    • 2021-11-04
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多