我有一个看起来像这样的数据框:
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
我尝试了多种方法,使用辅助色谱柱,但没有一种能产生接近我想要的结果。任何帮助将不胜感激:)
答案 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,应该将1
至9
行中的所有零变为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