【问题标题】:Delete all columns for which value repents consecutively more than 3 times删除所有 value 连续悔改超过 3 次的列
【发布时间】:2022-02-21 21:07:38
【问题描述】:

我有一个df,看起来像这样:

date stock1 stock2 stock3 stock4 stock5 stock6 stock7 stock8 stock9 stock10
10/20 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.9
11/20 0.1 0.9 0.3 0.4 0.3 0.5 0.3 0.2 0.4 0.1
12/20 0.1 0.6 0.9 0.5 0.6 0.7 0.8 0.7 0.9 0.1
10/20 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.9
11/20 0.8 0.9 0.3 0.4 0.3 0.5 0.3 0.2 0.9 0.1
12/20 0.3 0.6 0.9 0.5 0.6 0.7 0.8 0.7 0.9 0.1
10/20 0.1 0.2 0.3 0.4 0.5 0.7 0.7 0.8 0.9 0.9
11/20 0.8 0.9 0.3 0.4 0.3 0.7 0.3 0.2 0.4 0.1
12/20 0.3 0.6 0.9 0.5 0.6 0.7 0.8 0.7 0.9 0.1

我想删除相同值连续重复超过 3 次的所有列。在此示例中,应删除列“stock1”、“stock6”和“stock9”。在其他列中,我们有超过 3 次的重复值,但不是一个接一个。 我想我可以修改那个问题Removing values that repeat more than 5 times in Pandas DataFrame 中的代码,但我还不能做到这一点。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将“日期”设置为索引,然后检查行是否与下一行不同,将其用于groupby+cumcount

    然后计算每列的最大计数,如果大于 N-1,则删除该列:

    df2 = df.set_index('date')
    N = 3
    df2.loc[:, df2.apply(lambda c: c.groupby(c.ne(c.shift()).cumsum()).cumcount()).max().lt(N-1)]
    

    输出:

            stock2   stock3   stock4   stock5   stock7   stock8   stock10
    date                                                                 
    10/20       0.2      0.3      0.4      0.5      0.7      0.8      0.9
    11/20       0.9      0.3      0.4      0.3      0.3      0.2      0.1
    12/20       0.6      0.9      0.5      0.6      0.8      0.7      0.1
    10/20       0.2      0.3      0.4      0.5      0.7      0.8      0.9
    11/20       0.9      0.3      0.4      0.3      0.3      0.2      0.1
    12/20       0.6      0.9      0.5      0.6      0.8      0.7      0.1
    10/20       0.2      0.3      0.4      0.5      0.7      0.8      0.9
    11/20       0.9      0.3      0.4      0.3      0.3      0.2      0.1
    12/20       0.6      0.9      0.5      0.6      0.8      0.7      0.1
    

    连续值的中间计数:

    >>> df2.apply(lambda c: c.groupby(c.ne(c.shift()).cumsum()).cumcount())
    
            stock1   stock2   stock3   stock4   stock5   stock6   stock7   stock8   stock9   stock10
    date                                                                                            
    10/20         0        0        0        0        0        0        0        0        0        0
    11/20         1        0        1        1        0        0        0        0        0        0
    12/20         2        0        0        0        0        0        0        0        0        1
    10/20         3        0        0        0        0        0        0        0        1        0
    11/20         0        0        1        1        0        0        0        0        2        0
    12/20         0        0        0        0        0        0        0        0        3        1
    10/20         0        0        0        0        0        1        0        0        4        0
    11/20         0        0        1        1        0        2        0        0        0        0
    12/20         0        0        0        0        0        3        0        0        0        1
    

    【讨论】:

      【解决方案2】:

      你可以避免在这里申请:

      N = 3
      df.loc[:, 
         df.set_index('date')
           .ne(df.shift()).cumsum()
           .stack()
           .groupby(level=1)
           .value_counts()
           .max(level=0).le(N)]
      

      【讨论】:

      • 删除了太多列 ;)
      • 是的,现在它应该像我的一样工作了,除了使用 stack/groupby 代替 apply ;)
      • 我认为 groupby 里面 apply 可能很慢@mozway
      • 并非总是如此,尤其是因为 apply 位于此处的列(而不是行)上。明智地使用 apply 有时会更快,需要检查数据集
      • 我认为 stack() + groupby() 总是更快...数据框越大,列越多,@mozway 越差
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多