第一次达到数字时递增计数器

时间:2018-02-08 10:48:37

标签: python pandas counter

这可能是一个非常愚蠢的问题。但是,我仍然会继续问。如何在第一次达到特定值时递增计数器?

例如,如果我将下面的步骤作为df的列,并且想要添加一个名为' counter'的计数器列。这是第一次增加的步骤' column的值为6

enter image description here

5 个答案:

答案 0 :(得分:2)

您可以在.shift() -

中使用pandas
  

请注意,如果df['step']的值为6,您只想增加   df.shift(1)['step']的值 6。

df['counter'] = ((df['step']==6) & (df.shift(1)['step']!=6 )).cumsum()
print(df)

<强>输出

      step  counter
0      2        0
1      2        0
2      2        0
3      3        0
4      4        0
5      4        0
6      5        0
7      6        1
8      6        1
9      6        1
10     6        1
11     7        1
12     5        1
13     6        2
14     6        2
15     6        2
16     7        2
17     5        2
18     6        3
19     7        3
20     5        3

<强>解释

一个。如果df['step']==6boolean

,则True会提供step个值 - 6
0     False
1     False
2     False
3     False
4     False
5     False
6     False
7      True
8      True
9      True
10     True
11    False
12    False
13     True
14     True
15     True
16    False
17    False
18     True
19    False
20    False
Name: step, dtype: bool

df.shift(1)['step']!=6 将数据移位 1行,然后检查值是否等于6.

当这两个条件都满足时,你想增加 - .cumsum()将会解决这个问题。希望有所帮助!

P.S - 虽然这是一个很好的问题,但请不要粘贴图片。您可以直接将数据和格式粘贴为代码。帮助正在回答的人复制粘贴

答案 1 :(得分:2)

使用:

df = pd.DataFrame({'step':[2, 2, 2, 3, 4, 4, 5, 6, 6, 6, 6, 7, 5, 6, 6, 6, 7, 5, 6, 7, 5]})

a = df['step'] == 6
b = (~a).shift()
b[0] = a[0]
df['counter1'] = (a & b).cumsum()

print (df)
    step  counter
0      2        0
1      2        0
2      2        0
3      3        0
4      4        0
5      4        0
6      5        0
7      6        1
8      6        1
9      6        1
10     6        1
11     7        1
12     5        1
13     6        2
14     6        2
15     6        2
16     7        2
17     5        2
18     6        3
19     7        3
20     5        3

<强>解释

获取布尔掩码以与6进行比较:

a = df['step'] == 6

反转Seriesshift

b = (~a).shift()

如果第一个值为6,则不会获得第一个组,因此需要先按a值设置第一个值:

b[0] = a[0]

bitwise and - &的链条件:

c = a & b

获得累积总和:

d = c.cumsum()

print (pd.concat([df['step'], a, b, c, d], axis=1, keys=('abcde')))

    a      b      c      d  e
0   2  False  False  False  0
1   2  False   True  False  0
2   2  False   True  False  0
3   3  False   True  False  0
4   4  False   True  False  0
5   4  False   True  False  0
6   5  False   True  False  0
7   6   True   True   True  1
8   6   True  False  False  1
9   6   True  False  False  1
10  6   True  False  False  1
11  7  False  False  False  1
12  5  False   True  False  1
13  6   True   True   True  2
14  6   True  False  False  2
15  6   True  False  False  2
16  7  False  False  False  2
17  5  False   True  False  2
18  6   True   True   True  3
19  7  False  False  False  3
20  5  False   True  False  3

如果性能很重要,请使用numpy解决方案:

a = (df['step'] == 6).values
b = np.insert((~a)[:-1], 0, a[0])
df['counter1'] = np.cumsum(a & b)

答案 2 :(得分:1)

如果您的DataFrame被称为df,那么没有迭代的一种可能方式是

df['counter'] = 0
df.loc[1:, 'counter'] = ((df['steps'].values[1:] == 6) & (df['steps'].values[:-1] != 6)).cumsum()

这会创建两个布尔数组,当前一行包含6并且当前行包含6时,其连接为True。您可以对此数组求和以获取计数器。

答案 3 :(得分:0)

这不是一个愚蠢的问题。要在import numpy as np arr = np.genfromtxt('txt.csv') arr.reshape((len(arr)/4, 4)) # array([[ 1., 4., -69., -64.], # [ 1., 5., -57., -56.], # [ 1., 6., -59., -56.], # [ 1., 7., -69., -61.], # [ 1., 8., -53., -53.], # [ 1., 9., -69., -62.], # [ 1., 10., -65., -58.], # [ 1., 11., -69., -58.]]) 列中获得所需的输出,您可以尝试(例如):

counter

结果:

steps = [2, 2, 2, 3, 4, 4, 5, 6, 6, 6, 6, 7, 5, 6, 6, 6, 7, 5, 6, 7, 5]
counter = [idx for idx in range(len(steps)) if steps[idx] == 6 and (idx==0 or steps[idx-1] != 6)]
print(counter)

,这是>> [7, 13, 18] 中发生第一个steps的索引。您现在可以获得6发生的总时间,或者以您给出的确切方式重现第二列

len(counter)

答案 4 :(得分:0)

如果你的DataFrame被称为df,那就是

import pandas as pd

q_list = [2, 2, 2, 3, 4, 4, 5, 6, 6, 6, 6, 7, 5, 6, 6, 6, 7, 5, 6, 7, 5]
df = pd.DataFrame(q_list, columns=['step'])
counter = 0 
flag = False
for index, row in df.iterrows():
    if row ['step'] == 6 and flag == False:
         counter += 1
         flag = True
    elif row ['step'] != 6 and flag == True:
         flag = False
    df.set_value(index,'counter',counter)