【问题标题】:How do delete consecutive duplicate rows from pandas dataframe while also updating column values?如何在更新列值的同时从熊猫数据框中删除连续的重复行?
【发布时间】:2019-10-28 12:11:37
【问题描述】:

我有以下数据结构:

     |a       |b     |start_time  |end_time
0    |aaba    |d     |11:26       | 11:27
1    |aba     |c     |11:27       | 11:32
2    |aba     |c     |11:32       | 11:34
3    |cab     |ab    |11:34       | 11:35
4    |aba     |c     |11:35       | 11:40

我想合并列a 和b 上重复的连续行,然后我想将新行的start_time 和end_time 更新为两者中的较早者和后面的分别是两个。

由于条目是连续的,这意味着保留第一个的start_time 和第二个的end_time。通常有两个一个接一个的重复。

所以在上述情况下,我想合并行 1 和 2 并最终得到:

     |a    |b    |start_time  |end_time
0    |aaba    |d     |11:26       | 11:27
1    |aba     |c     |11:27       | 11:34
2    |cab     |ab    |11:34       | 11:35
3    |aba     |c     |11:35       | 11:40

我尝试使用loc 并在第一次运行时更新end_time 列,然后在第二次删除重复项,但运行两次loc 似乎很浪费:

df.loc[(df['a']+df['b']) == (df['a']+df['b']).shift(-1), 'end_time'] = df['end_time'].shift(-1)

df = df.loc[(df['a']+df['b']) != (df['a']+df['b']).shift(-1)]

有没有办法删除重复项并仅通过一次迭代更新 end_time 值?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    在a、b 上执行groupby 和 groupID 在连续的b 和as_index=False 上。每组agg 最小值为start_time 和end_time 最大值

    df.groupby(['a','b', df.b.ne(df.b.shift()).cumsum()], as_index=False).agg({'start_time': 'min', 'end_time': 'max'})
    
    Out[1649]:
          a   b start_time end_time
    0  aaba   d      11:26    11:27
    1   aba   c      11:27    11:34
    2   aba   c      11:35    11:40
    3   cab  ab      11:34    11:35
    

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多