Pandas Dataframe-通过条件无条件重置计数值的行迭代

时间:2018-07-16 21:14:38

标签: python pandas bigdata

我与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 

2 个答案:

答案 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