pandas - 根据列值合并几乎重复的行

Mat*_*hal 19 python pandas

我有一个pandas数据框,其中有几行彼此接近重复,除了一个值.我的目标是将这些行合并或"合并"成一行,而不对数值求和.

以下是我正在使用的示例:

Name   Sid   Use_Case  Revenue
A      xx01  Voice     $10.00
A      xx01  SMS       $10.00
B      xx02  Voice     $5.00
C      xx03  Voice     $15.00
C      xx03  SMS       $15.00
C      xx03  Video     $15.00
Run Code Online (Sandbox Code Playgroud)

这就是我想要的:

Name   Sid   Use_Case            Revenue
A      xx01  Voice, SMS          $10.00
B      xx02  Voice               $5.00
C      xx03  Voice, SMS, Video   $15.00
Run Code Online (Sandbox Code Playgroud)

我不想总结"收入"列的原因是因为我的表是在几个时间段内进行调整的结果,其中"收入"最终被多次列出而不是每个"Use_Case"具有不同的值.

解决这个问题的最佳方法是什么?我调查了这个groupby()功能,但我仍然不太了解它.

jez*_*ael 29

我想你可以使用groupby与和自定义功能:aggregate first', '.join

df = df.groupby('Name').agg({'Sid':'first', 
                             'Use_Case': ', '.join, 
                             'Revenue':'first' }).reset_index()

#change column order                           
print df[['Name','Sid','Use_Case','Revenue']]                              
  Name   Sid           Use_Case Revenue
0    A  xx01         Voice, SMS  $10.00
1    B  xx02              Voice   $5.00
2    C  xx03  Voice, SMS, Video  $15.00
Run Code Online (Sandbox Code Playgroud)

评论的好主意,谢谢Goyo:

df = df.groupby(['Name','Sid','Revenue'])['Use_Case'].apply(', '.join).reset_index()

#change column order                           
print df[['Name','Sid','Use_Case','Revenue']]                              
  Name   Sid           Use_Case Revenue
0    A  xx01         Voice, SMS  $10.00
1    B  xx02              Voice   $5.00
2    C  xx03  Voice, SMS, Video  $15.00
Run Code Online (Sandbox Code Playgroud)

  • 除了''Use_Case'`之外,我会把所有内容分组,以防万一.聚合函数也可以只是'','.join`,不需要使用`lambda` .. (3认同)
  • 是的,或者使用`.astype(str)`,它是转换为字符串的函数。 (2认同)
  • @panda - 将 `', '.join` 更改为 `lambda x: ', '.join(set(x))` (2认同)

Ami*_*ory 12

你能groupbyapplylist功能:

>>> df['Use_Case'].groupby([df.Name, df.Sid, df.Revenue]).apply(list).reset_index()
    Name    Sid     Revenue     0
0   A   xx01    $10.00  [Voice, SMS]
1   B   xx02    $5.00   [Voice]
2   C   xx03    $15.00  [Voice, SMS, Video]
Run Code Online (Sandbox Code Playgroud)

(如果您担心重复,请使用set代替list。)