Python 使用dataframe lambda函数/applymap将多行合并到一列中并删除重复项

Python 使用dataframe lambda函数/applymap将多行合并到一列中并删除重复项,python,pandas,apply,python-applymap,Python,Pandas,Apply,Python Applymap,如何在数据帧上执行以下操作 将一列、多行中的文本合并为一行 删除“一行”中的重复项 对多个列重复1和2 基于下面的堆栈溢出问题和答案,我编写了下面的代码。最后一次尝试已接近尾声,但我不知道如何将集合转换回字符串(即删除大括号)并将其滚动到lambda函数中,我可以对多个列使用applymap() 示例数据帧 id = [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4] colA = ['type12', 'type11'

如何在数据帧上执行以下操作

  • 将一列、多行中的文本合并为一行
  • 删除“一行”中的重复项
  • 对多个列重复1和2
  • 基于下面的堆栈溢出问题和答案,我编写了下面的代码。最后一次尝试已接近尾声,但我不知道如何将集合转换回字符串(即删除大括号)并将其滚动到lambda函数中,我可以对多个列使用applymap()

  • 示例数据帧

    id = [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]
    colA = ['type12', 'type11', 'type11', 'type11', 'type21', 'type21', 
            'type22', 'type23', 'type23', 'type23', 'type31', 'type31', 
            'type31', 'type31', 'type41', 'type41', 'type42', 'type41', 
            'type41', 'type43'
            ]
    colB = ['Set A', 'Set B', 'Set B', 'Set B', 'Set B', 'Set B', 'Set A', 
            'Set B', 'Set C', 'Set C', 'Set B', 'Set C', 'Set B', 'Set C', 
            'Set B', 'Set B', 'Set A', 'Set C', 'Set B', 'Set A'
            ]
    colC = ['alpha', 'beta', 'delta', 'charlie', 'beta', 'delta', 'alpha', 
            'charlie', 'charlie', 'delta', 'delta', 'charlie', 'beta', 
            'delta', 'beta', 'charlie', 'alpha', 'charlie', 'delta', 'alpha'
            ]
    df = pd.DataFrame(list(zip(id, colA, colB, colC)), columns =['id', 'colA', 'colB', 'colC'])
    print(df)
    
        id    colA   colB     colC
    0    1  type12  Set A    alpha
    1    1  type11  Set B     beta
    2    1  type11  Set B    delta
    3    1  type11  Set B  charlie
    4    2  type21  Set B     beta
    5    2  type21  Set B    delta
    6    2  type22  Set A    alpha
    7    2  type23  Set B  charlie
    8    2  type23  Set C  charlie
    9    2  type23  Set C    delta
    10   3  type31  Set B    delta
    11   3  type31  Set C  charlie
    12   3  type31  Set B     beta
    13   3  type31  Set C    delta
    14   4  type41  Set B     beta
    15   4  type41  Set B  charlie
    16   4  type42  Set A    alpha
    17   4  type41  Set C  charlie
    18   4  type41  Set B    delta
    19   4  type43  Set A    alpha
    
    所需输出

    id  colA    colB           colC
    1   type11  Set B          beta, delta, charlie
    1   type12  Set A          alpha
    2   type21  Set B          beta, delta
    2   type22  Set A          alpha
    2   type23  Set B, Set C   charlie, delta
    3   type31  Set B, Set C   beta, delta, charlie
    4   type41  Set B, Set C   beta, delta, charlie
    4   type42  Set A          alpha
    4   type43  Set A          alpha
    
    df2 = df.groupby(['id', 'colA'])['colB'].apply(list).apply(set).reset_index()
    print(df2)
       id    colA            colB
    0   1  type11         {Set B}
    1   1  type12         {Set A}
    2   2  type21         {Set B}
    3   2  type22         {Set A}
    4   2  type23  {Set B, Set C}
    5   3  type31  {Set B, Set C}
    6   4  type41  {Set B, Set C}
    7   4  type42         {Set A}
    8   4  type43         {Set A}
    
    仅尝试返回字符串但仍有重复项的一列

    df2 = df.groupby(['id', 'colA'])['colB'].apply(', '.join).reset_index()
    print(df2)
       id    colA                        colB
    0   1  type11         Set B, Set B, Set B
    1   1  type12                       Set A
    2   2  type21                Set B, Set B
    3   2  type22                       Set A
    4   2  type23         Set B, Set C, Set C
    5   3  type31  Set B, Set C, Set B, Set C
    6   4  type41  Set B, Set B, Set C, Set B
    7   4  type42                       Set A
    8   4  type43                       Set A
    
    仅尝试删除重复项但返回集合的一列

    id  colA    colB           colC
    1   type11  Set B          beta, delta, charlie
    1   type12  Set A          alpha
    2   type21  Set B          beta, delta
    2   type22  Set A          alpha
    2   type23  Set B, Set C   charlie, delta
    3   type31  Set B, Set C   beta, delta, charlie
    4   type41  Set B, Set C   beta, delta, charlie
    4   type42  Set A          alpha
    4   type43  Set A          alpha
    
    df2 = df.groupby(['id', 'colA'])['colB'].apply(list).apply(set).reset_index()
    print(df2)
       id    colA            colB
    0   1  type11         {Set B}
    1   1  type12         {Set A}
    2   2  type21         {Set B}
    3   2  type22         {Set A}
    4   2  type23  {Set B, Set C}
    5   3  type31  {Set B, Set C}
    6   4  type41  {Set B, Set C}
    7   4  type42         {Set A}
    8   4  type43         {Set A}
    

    您可以在groupby中使用
    lambda
    <代码>在组内的序列上放置重复项,然后加入字符串
    agg
    将处理所有非分组列的列,或指定一个子集

    df.groupby(['id', 'colA']).agg(lambda x: ', '.join(x.drop_duplicates())).reset_index()
    


    很接近,只需进一步应用
    list()
    join()
    ,如下所示:

    df2 = df.groupby(['id', 'colA']).apply(list).apply(set).apply(list).apply(', '.join).reset_index()
    
    df2 = df.groupby(['id', 'colA']).agg(lambda x: ', '.join(list(set(list(x))))).reset_index()
    
    
    
    print(df2)
    
       id    colA          colB                  colC
    0   1  type11         Set B  delta, charlie, beta
    1   1  type12         Set A                 alpha
    2   2  type21         Set B           delta, beta
    3   2  type22         Set A                 alpha
    4   2  type23  Set B, Set C        delta, charlie
    5   3  type31  Set B, Set C  delta, charlie, beta
    6   4  type41  Set B, Set C  delta, charlie, beta
    7   4  type42         Set A                 alpha
    8   4  type43         Set A                 alpha
    
    如果要使用lambda函数,请将其与
    agg()
    一起使用,如下所示:

    df2 = df.groupby(['id', 'colA']).apply(list).apply(set).apply(list).apply(', '.join).reset_index()
    
    df2 = df.groupby(['id', 'colA']).agg(lambda x: ', '.join(list(set(list(x))))).reset_index()
    
    
    
    print(df2)
    
       id    colA          colB                  colC
    0   1  type11         Set B  delta, charlie, beta
    1   1  type12         Set A                 alpha
    2   2  type21         Set B           delta, beta
    3   2  type22         Set A                 alpha
    4   2  type23  Set B, Set C        delta, charlie
    5   3  type31  Set B, Set C  delta, charlie, beta
    6   4  type41  Set B, Set C  delta, charlie, beta
    7   4  type42         Set A                 alpha
    8   4  type43         Set A                 alpha