【问题标题】:Adding a count to prior cell value in Pandas在 Pandas 中为先前的单元格值添加计数
【发布时间】:2016-05-08 11:33:45
【问题描述】:

在 Pandas 中,我希望根据另一列“A”的布尔值在“B”列中添加一个值。因此,如果“A”为真,那么只要“A”为假,就开始计数(即每新行添加一个)。当“A”为真时复位并重新开始计数。我设法用'for'循环来做到这一点,但这非常耗时。我想知道是否没有更省时的解决方案?

结果应该是这样的:

Date     A      B 
01.2010 False   0
02.2010 True    1
03.2010 False   2
04.2010 False   3
05.2010 True    1
06.2010 False   2

【问题讨论】:

    标签: python pandas dataframe counter


    【解决方案1】:

    您可以将cumsumgroupbycumcount 一起使用:

    print df
        Date      A
    0  1.201  False
    1  1.201   True
    2  1.201  False
    3  2.201   True
    4  3.201  False
    5  4.201  False
    6  5.201   True
    7  6.201  False
    roll = df.A.cumsum()
    print roll
    0    0
    1    1
    2    1
    3    2
    4    2
    5    2
    6    3
    7    3
    Name: A, dtype: int32
    
    df['B'] = df.groupby(roll).cumcount() + 1
    #if in first values are False, output is 0
    df.loc[roll == 0 , 'B'] = 0   
    print df
        Date      A  B
    0  1.201  False  0
    1  1.201   True  1
    2  1.201  False  2
    3  2.201   True  1
    4  3.201  False  2
    5  4.201  False  3
    6  5.201   True  1
    7  6.201  False  2
    

    【讨论】:

      【解决方案2】:

      谢谢,我从另一个类似的帖子中得到了解决方案:

      rolling_count = 0
      def set_counter(val):
      
        if val == False: 
      
          global rolling_count  
          rolling_count +=1
      
        else:
      
          val == True
          rolling_count = 1
      
        return rolling_count
      
      df['B'] = df['A'].map(set_counter)
      

      【讨论】:

      • 我测试了两种解决方案的时间,首先您的解决方案有不同的输出 - 第一行在您的解决方案中有1,而不是0 在列B。如果使用len(df)=7000 检查时间:%timeit (al(df1)) 100 loops, best of 3: 3.75 ms per loop vs %timeit (jez(df)) 100 loops, best of 3: 2.29 ms per loop。最后你因为接受而丢了 2 分。但这取决于您,如果您认为最好接受您的解决方案。
      • @jezrael,非常感谢。来自 Excel/vba,我发现我提出的解决方案更直观,并且在现实生活中发挥了作用。尽管如此,您的解决方案更像是熊猫。 cumcount() 和 cumsum() 的区别我还是要研究一下。
      • 也感谢您的接受。我认为如果可能的话最好使用 pandas 的功能,它更优化为自定义功能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 2014-01-03
      • 2014-08-19
      相关资源
      最近更新 更多