这可能是一个非常愚蠢的问题。但是,我仍然会继续问。如何在第一次达到特定值时递增计数器?
例如,如果我将下面的步骤作为df的列,并且想要添加一个名为' counter'的计数器列。这是第一次增加的步骤' column的值为6
答案 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']==6
为boolean
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
反转Series
和shift
:
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)