【问题标题】:Pandas dataframe lambda function/applymap to combine multiple rows in a column and remove duplicatesPandas 数据框 lambda 函数/applymap 将多行组合在一列中并删除重复项
【发布时间】:2021-06-25 20:04:44
【问题描述】:

如何对 pandas 数据框执行以下操作?

  1. 将一列中的多行文本合并为一行
  2. 删除“一行”中的重复项
  3. 对多列重复 1 和 2

基于以下 Stack Overflow 问题和答案,我在下面尝试了代码。最后一次尝试很接近,但我不知道如何将集合转换回字符串(即删除大括号)并将其转换为我可以将 applymap() 用于多个列的 lambda 函数。

  1. How to combine multiple rows into a single row with pandas [duplicate]
  2. Concatenate strings from several rows using Pandas groupby
  3. Remove duplicates from rows and columns (cell) in a dataframe, python

示例数据框

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(', '.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

仅尝试删除重复但返回集合的一列

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}

【问题讨论】:

    标签: python pandas apply python-applymap


    【解决方案1】:

    你很接近,只需进一步申请list()join()如下:

    df2 = df.groupby(['id', 'colA']).apply(list).apply(set).apply(list).apply(', '.join).reset_index()
    

    如果要使用 lambda 函数,请与 agg() 一起使用,如下所示:

    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
    

    【讨论】:

      【解决方案2】:

      您可以在 groupby 中使用lambdadrop_duplicates 在组内的系列上然后加入字符串。 agg 将适用于不是您的分组列的所有列,或指定一个子集。

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

         id    colA          colB                  colC
      0   1  type11         Set B  beta, delta, charlie
      1   1  type12         Set A                 alpha
      2   2  type21         Set B           beta, delta
      3   2  type22         Set A                 alpha
      4   2  type23  Set B, Set C        charlie, delta
      5   3  type31  Set B, Set C  delta, charlie, beta
      6   4  type41  Set B, Set C  beta, charlie, delta
      7   4  type42         Set A                 alpha
      8   4  type43         Set A                 alpha
      

      【讨论】:

        猜你喜欢
        • 2021-09-08
        • 2020-12-21
        • 2020-12-23
        • 2020-08-16
        • 2020-10-06
        • 2021-03-08
        • 1970-01-01
        • 2018-06-09
        • 2011-11-18
        相关资源
        最近更新 更多