【问题标题】:Drop rows if value in column changes如果列中的值发生更改,则删除行
【发布时间】:2020-06-19 14:41:39
【问题描述】:

假设我有以下熊猫数据框:

   my_class  value
0      1      1
1      1      2
2      1      3
3      2      4
4      2      5
5      2      6
6      2      7
7      2      8
8      2      9
9      3     10
10     3     11
11     3     12

我想确定类更改的“my_class”的索引,并在该索引之后和之前删除 n 行。此示例的输出(n=2)应如下所示:

   my_class  value
0      1      1
5      2      6
6      2      7
11     3     12

【问题讨论】:

  • 你有没有尝试过?
  • 我可以使用 for 循环并循环遍历列以查找更改并删除行,但我想避免 for 循环,因为我的数据集比这个示例大得多。跨度>

标签: python pandas


【解决方案1】:

我的做法:

# where class changes happen
s = df['my_class'].ne(df['my_class'].shift(-1).fillna(df['my_class']))

# mask with `bfill` and `ffill`
df[~(s.where(s).bfill(limit=1).ffill(limit=2).eq(1))]

输出:

    my_class  value
0          1      1
5          2      6
6          2      7
11         3     12

【讨论】:

    【解决方案2】:

    一种可能的解决方案是:

    • 利用索引包含连续整数这一事实。
    • 查找 class 发生变化的索引值。
    • 为每个这样的索引从 n-2 生成一个索引序列 到 n+1 并将它们连接起来。
    • 检索索引不在此列表中的行。

    代码如下:

    ind = df[df['my_class'].diff().fillna(0, downcast='infer') == 1].index
    df[~df.index.isin([item for sublist in
        [ range(i-2, i+2) for i in ind ] for item in sublist])]
    

    【讨论】:

      【解决方案3】:
      my_class = np.array([1] * 3 + [2] * 6 + [3] * 3)
      cols = np.c_[my_class, np.arange(len(my_class)) + 1]
      
      df = pd.DataFrame(cols, columns=['my_class', 'value'])
      df['diff'] = df['my_class'].diff().fillna(0)
      
      idx2drop = []
      
      for i in df[df['diff'] == 1].index:
          idx2drop += range(i - 2, i + 2)
      
      print(df.drop(idx_drop)[['my_class', 'value']])
      

      输出:

            my_class  value
        0        1      1
        5        2      6
        6        2      7
        11       3     12
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        相关资源
        最近更新 更多