使用某些条件查找数据框的某些部分

时间:2019-11-28 15:21:00

标签: python python-3.x pandas

我有一个看起来像这样的数据框:

>>> data = {'Count':[15, 21, 1, 7, 6, 1, 25, 8, 56, 0, 5, 9, 0, 12, 12, 8, 7, 12, 0, 8]}
>>> df = pd.DataFrame(data)
>>> df
    Count
0      15
1      21
2       1
3       7
4       6
5       1
6      25
7       8
8      56
9       0
10      5
11      9
12      0
13     12
14     12
15      8
16      7
17     12
18      0
19      8

我需要在此df中添加两列以检测“洪水”。 “洪水”的定义是从“计数”高于10直到“计数”低于5的行开始。 因此,在这种情况下,我希望这样做:

    Count   Flood   FloodNumber
0      15    True             1
1      21    True             1
2       1   False             0
3       7   False             0
4       6   False             0
5       1   False             0
6      25    True             2
7       8    True             2
8      56    True             2
9       0   False             0
10      5   False             0
11      9   False             0
12      0   False             0
13     12    True             3
14     12    True             3
15      8    True             3
16      7    True             3
17     12    True             3
18      0   False             0
19      8   False             0

我设法通过如下简单的循环添加“ Flood”列:

df.loc[0, 'Flood'] = (df.loc[0, 'Count'] > 10)
for index in range(1, len(df)):
    df.loc[index, 'Flood'] = ((df.loc[index, 'Count'] > 10) | ((df.loc[index-1, 'Flood']) & (df.loc[index, 'Count'] > 5)))

,但这似乎是一种极其缓慢而愚蠢的方式。是否有任何使用熊猫函数而非循环的“适当”方法?

1 个答案:

答案 0 :(得分:1)

要找到Flood标志,我们可以玩面具和ffill()

df['Flood'] = ((df.Count > 10).where(df.Count > 10)
               .fillna((df.Count > 5)
                       .where(df.Count < 5))
               .ffill()
               .astype(bool))

要获取FloodNumber,请忽略False列和groupby + cumsum中所有Flood的行

s = df.Flood.where(df.Flood)
df.loc[:, 'FloodNumber'] = s.dropna().groupby((s != s.shift(1)).cumsum()).ngroup().add(1)

输出

    Count  Flood  FloodNumber
0      15   True          1.0
1      21   True          1.0
2       1  False          NaN
3       7  False          NaN
4       6  False          NaN
5       1  False          NaN
6      25   True          2.0
7       8   True          2.0
8      56   True          2.0
9       0  False          NaN
10      5  False          NaN
11      9  False          NaN
12      0  False          NaN
13     12   True          3.0
14     12   True          3.0
15      8   True          3.0
16      7   True          3.0
17     12   True          3.0
18      0  False          NaN
19      8  False          NaN