【问题标题】:Pandas: Drop and count consecutive duplicates with conditionPandas:根据条件删除并计算连续重复项
【发布时间】:2019-10-15 21:02:32
【问题描述】:

val 等于 1 时,我想删除并计算列 val 中的重复项。

然后将start设置为第一行,end设置为最后一行连续重复。

df = pd.DataFrame()
df['start'] = [1, 2, 3, 4, 5, 6, 18, 30, 31] 
df['end'] = [2, 3, 4, 5, 6, 18, 30, 31, 32]
df['val'] = [1 , 1, 1, 1, 1, 12, 12, 1, 1]

df

   start  end  val
0      1    2    1
1      2    3    1
2      3    4    1
3      4    5    1
4      5    6    1
5      6   18   12
6     18   30   12
7     30   31    1
8     31   32    1

预期结果

   start  end  val
0      1    6    5
1      6   18   12
2     18   30   12
3     30   32    2

我试过了。 df[~((df.val==1) & (df.val == df.val.shift(1)) & (df.val == df.val.shift(-1)))]

  start  end  val
0      1    2    1
4      5    6    1
5      6   18   12
6     18   30   12
7     30   31    1
8     31   32    1

但我不知道如何完成我的预期结果,有什么建议吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    用途:

    #mask by condition
    m = df.val==1
    #consecutive groups
    g = m.ne(m.shift()).cumsum()
    #filter by condition and aggregate per groups
    df1 = df.groupby(g[m]).agg({'start':'first', 'end':'last', 'val':'sum'})
    #concat together, for correct order create index by g
    df = pd.concat([df1, df.set_index(g)[~m.values]]).sort_index().reset_index(drop=True)
    print (df)
       start  end  val
    0      1    6    5
    1      6   18   12
    2     18   30   12
    3     30   32    2
    

    【讨论】:

    • 感谢您的回答!当我尝试定义连续重复组时,我被卡住了。谢谢!
    【解决方案2】:

    你也可以用一个掩码来做一个两行的分组:

    m = (df.val.ne(1) | df.val.ne(df.val.shift())).cumsum()
    df = df.groupby(m).agg({'start': 'first', 'end': 'last', 'val': 'last'})
    

    【讨论】:

    • 谢谢。如果您将last 更改为sum 将给出正确的结果。
    【解决方案3】:

    @jezrael 的解决方案非常完美,但这里的方法略有不同:

    df['aux'] = (df['val'] != df['val'].shift()).cumsum()
    df.loc[df['val'] == 1, 'end'] = df[df['val'] == 1].groupby('aux')['end'].transform('last')
    df.loc[df['val'] == 1, 'val'] = df.groupby('aux')['val'].transform('sum')
    df = df.drop_duplicates(subset=df.columns.difference(['start']), keep='first')
    df = df.drop(columns=['aux'])
    
    

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 2012-10-09
      • 2021-04-02
      • 1970-01-01
      • 2020-06-12
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多