当连续值的数量低于某个阈值时,查找数据帧中连续值的索引

时间:2019-02-05 14:05:03

标签: python pandas

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

                     night  DSWRF_integ
ForecastTime
2018-05-12 00:00:00    1.0            1
2018-05-12 00:15:00    0.0            1
2018-05-12 00:30:00    0.0            1
2018-05-12 00:45:00    0.0            1
2018-05-12 01:00:00    0.0            0
2018-05-12 01:15:00    0.0            0
2018-05-12 01:30:00    0.0            0
2018-05-12 01:45:00    0.0            0
2018-05-12 02:00:00    0.0            0
2018-05-12 02:15:00    0.0            0
2018-05-12 02:30:00    0.0            0
2018-05-12 02:45:00    0.0            0
2018-05-12 03:00:00    0.0            0
2018-05-12 03:15:00    0.0            0
2018-05-12 03:30:00    0.0            0
2018-05-12 03:45:00    0.0            0
2018-05-12 04:00:00    0.0            0
2018-05-12 04:15:00    0.0            0
2018-05-12 04:30:00    0.0            0
2018-05-12 04:45:00    0.0            0
2018-05-12 05:00:00    0.0            0
2018-05-12 05:15:00    0.0            0
2018-05-12 05:30:00    0.0            0
2018-05-12 05:45:00    0.0            0
2018-05-12 06:00:00    0.0            0
2018-05-12 06:15:00    0.0            0
2018-05-12 06:30:00    0.0            0
2018-05-12 06:45:00    0.0            0
2018-05-12 07:00:00    0.0            0
2018-05-12 07:15:00    0.0            0
2018-05-12 07:30:00    0.0            0
2018-05-12 07:45:00    0.0            0
2018-05-12 08:00:00    0.0            0
2018-05-12 08:15:00    0.0            0
2018-05-12 08:30:00    0.0            0
2018-05-12 08:45:00    0.0            0
2018-05-12 09:00:00    0.0            0
2018-05-12 09:15:00    0.0            0
2018-05-12 09:30:00    0.0            0
2018-05-12 09:45:00    0.0            0
2018-05-12 10:00:00    0.0            0
2018-05-12 10:15:00    0.0            0
2018-05-12 10:30:00    0.0            0
2018-05-12 10:45:00    0.0            0
2018-05-12 11:00:00    0.0            0
2018-05-12 11:15:00    0.0            1
2018-05-12 11:30:00    0.0            1
2018-05-12 11:45:00    0.0            1

2018-05-12 12:00:00    0.0            0
2018-05-12 12:15:00    0.0            0
2018-05-12 12:30:00    0.0            0
2018-05-12 12:45:00    0.0            0
2018-05-12 13:00:00    0.0            0
2018-05-12 13:15:00    0.0            0
2018-05-12 13:30:00    0.0            0
2018-05-12 13:45:00    0.0            0

2018-05-12 14:00:00    1.0            1
2018-05-12 14:15:00    1.0            1
2018-05-12 14:30:00    1.0            1
2018-05-12 14:45:00    1.0            1
2018-05-12 15:00:00    1.0            1

我试图找出一种逻辑,而不是因为它太慢而无法遍历数据帧,以便能够将 DSWRF_integ 列中的连续零转换为1,仅当< / strong>连续零的数目小于特定阈值(例如,阈值= 10)。

在这种情况下,我想用 2018-05-12 12:00:00 2018-时间段将DSWRF_integ列中的所有零替换为1。 05-12 13:45:00 ,因为那里的连续零个数小于10。

结果数据框应如下所示:

                     night  DSWRF_integ
ForecastTime
2018-05-12 00:00:00    1.0            1
2018-05-12 00:15:00    0.0            1
2018-05-12 00:30:00    0.0            1
2018-05-12 00:45:00    0.0            1
2018-05-12 01:00:00    0.0            0
2018-05-12 01:15:00    0.0            0
2018-05-12 01:30:00    0.0            0
2018-05-12 01:45:00    0.0            0
2018-05-12 02:00:00    0.0            0
2018-05-12 02:15:00    0.0            0
2018-05-12 02:30:00    0.0            0
2018-05-12 02:45:00    0.0            0
2018-05-12 03:00:00    0.0            0
2018-05-12 03:15:00    0.0            0
2018-05-12 03:30:00    0.0            0
2018-05-12 03:45:00    0.0            0
2018-05-12 04:00:00    0.0            0
2018-05-12 04:15:00    0.0            0
2018-05-12 04:30:00    0.0            0
2018-05-12 04:45:00    0.0            0
2018-05-12 05:00:00    0.0            0
2018-05-12 05:15:00    0.0            0
2018-05-12 05:30:00    0.0            0
2018-05-12 05:45:00    0.0            0
2018-05-12 06:00:00    0.0            0
2018-05-12 06:15:00    0.0            0
2018-05-12 06:30:00    0.0            0
2018-05-12 06:45:00    0.0            0
2018-05-12 07:00:00    0.0            0
2018-05-12 07:15:00    0.0            0
2018-05-12 07:30:00    0.0            0
2018-05-12 07:45:00    0.0            0
2018-05-12 08:00:00    0.0            0
2018-05-12 08:15:00    0.0            0
2018-05-12 08:30:00    0.0            0
2018-05-12 08:45:00    0.0            0
2018-05-12 09:00:00    0.0            0
2018-05-12 09:15:00    0.0            0
2018-05-12 09:30:00    0.0            0
2018-05-12 09:45:00    0.0            0
2018-05-12 10:00:00    0.0            0
2018-05-12 10:15:00    0.0            0
2018-05-12 10:30:00    0.0            0
2018-05-12 10:45:00    0.0            0
2018-05-12 11:00:00    0.0            0
2018-05-12 11:15:00    0.0            1
2018-05-12 11:30:00    0.0            1
2018-05-12 11:45:00    0.0            1

2018-05-12 12:00:00    0.0            1
2018-05-12 12:15:00    0.0            1
2018-05-12 12:30:00    0.0            1
2018-05-12 12:45:00    0.0            1
2018-05-12 13:00:00    0.0            1
2018-05-12 13:15:00    0.0            1
2018-05-12 13:30:00    0.0            1
2018-05-12 13:45:00    0.0            1

2018-05-12 14:00:00    1.0            1
2018-05-12 14:15:00    1.0            1
2018-05-12 14:30:00    1.0            1
2018-05-12 14:45:00    1.0            1
2018-05-12 15:00:00    1.0            1

我尝试了多种方法,使用辅助色谱柱,但没有一种能产生接近我想要的结果。任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

th = 3 # set threshold

# Sets to True rows that are 0
x = df.DSWRF_integ.eq(0)

# Takes the cumulative sum of rows where changes occur (thus where diff != 0)
g = x.astype(int).diff().fillna(0).ne(0).cumsum()

# Groups the original df with g and replaces 0 to 1 where the length of consecutive zeroes
# is smaller than the threshold
ix = x[x].groupby(g[x]).transform('size').lt(th) = 1
df.loc[ix[ix].index, 'DSWRF_integ'] = 1

示例

我已经创建了此示例数据框,以更轻松地检查生成的数据框。我还创建了一个最终数据框,其中添加了所有中间pd.Series,以更好地理解所有步骤:

df = pd.DataFrame({'col1':[0,0,0,2,1,3,0,1,2,0,0,0,0,1]})

现在,例如将阈值设置为4,应该将19行中的所有零变为12

result = df.copy()
th = 4
x = df.col1.eq(0)
g = x.astype(int).diff().fillna(0).ne(0).cumsum()
ix = x[x].groupby(g[x]).transform('size').lt(th) 
result.loc[ix[ix].index, 'col1'] = 1

df.assign(x=x, g=g, ix=ix, result=result)

     col1   x    g    ix     result
0      0   True  0   True       1
1      0   True  0   True       1
2      0   True  0   True       1
3      2  False  1    NaN       2
4      1  False  1    NaN       1
5      3  False  1    NaN       3
6      0   True  2   True       1
7      1  False  3    NaN       1
8      2  False  3    NaN       2
9      0   True  4  False       0
10     0   True  4  False       0
11     0   True  4  False       0
12     0   True  4  False       0
13     1  False  5    NaN       1