我与Pandas合作,我正在尝试创建一个矢量,该矢量的值会增加,尤其是根据条件重置。由于数据量很大,我需要替代循环。我找不到“计数”值被重置并开始根据条件重新计数而不使用循环的任何情况。
输入数据:
Out[73]:
Time Force
0 1 -10
1 2 -8
2 3 -12
3 4 -30
4 5 12
5 6 16
6 7 -8
7 8 -10
8 9 -40
9 10 -50
10 11 -60
11 12 -70
12 13 -50
13 14 -10
我想创建一个新的向量'count',当'Force'值在-5到-15之间时,该值增加。当它超出此阈值时,“ Count”值将重置为0,并在阈值之内再次开始于Count()。
我想拥有的东西
Time Force Count
0 1 -10 1
1 2 -8 2
2 3 -12 3
3 4 -30 0
4 5 12 0
5 6 16 0
6 7 -8 1
7 8 -10 2
8 9 -40 0
9 10 -50 0
10 11 -60 0
11 12 -70 0
12 13 -50 0
13 14 -10 1
答案 0 :(得分:2)
IIUC,
mask = ((df.Force > -15) & (df.Force < -5))
df['count'] = mask.groupby((~mask).cumsum()).cumsum().astype(int)
print(df)
输出:
Time Force count
0 1 -10 1
1 2 -8 2
2 3 -12 3
3 4 -30 0
4 5 12 0
5 6 16 0
6 7 -8 1
7 8 -10 2
8 9 -40 0
9 10 -50 0
10 11 -60 0
11 12 -70 0
12 13 -50 0
13 14 -10 1
答案 1 :(得分:0)
这是使用循环的一种方法:
# Give default value to "Count"
df['Count'] = 0
# Boolean 1 or 0
df['range'] = df['Force'].apply(lambda x: 1 if x > -15 and x < -5 else 0)
# Accounting for edge case with check on first row.
for i in range(0, len(df)):
if (i == 0) and (df.iloc[0]['range'] == 1):
df.loc[i, 'Count'] = 1
if (i != 0) and (df.loc[i, 'range'] == 1):
df.loc[i, 'Count'] = df.loc[i-1, 'Count'] + df.loc[i, 'range']
else:
df.loc[i, 'Count'] == 0
df.drop('range', axis=1, inplace=True)
df
Time Force Count
0 1 -10 1
1 2 -8 2
2 3 -12 3
3 4 -30 0
4 5 12 0
5 6 16 0
6 7 -8 1
7 8 -10 2
8 9 -40 0
9 10 -50 0
10 11 -60 0
11 12 -70 0
12 13 -50 0
13 14 -10 1