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

2024-04-27 00:47:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. 将一列、多行中的文本合并为一行
  2. 删除“一行”中的重复项
  3. 重复1&;2用于多列

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

  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}

Tags: alphaidbetadeltasetcharliecolbcola
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

您很接近,只需进一步应用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

相关问题 更多 >