【问题标题】:pandas data frame: Find consecutive values and ignoring gaps of certain size熊猫数据框:查找连续值并忽略一定大小的间隙
【发布时间】:2016-08-05 13:34:21
【问题描述】:

我正在努力处理每小时降水数据,例如

index=pd.date_range('1/1/2011', periods=365*24, freq='H')
precipitation_indicator=np.random.randint(low=0, high=2, size=(365*24,))
precipitation_sum=np.random.ranf((365*24,))*6*precipitation_indicator

prec_dataH=pd.DataFrame(data={'prec_ind':precipitation_indicator, prec_sum':precipitation_sum},index=index)

如果在连续的时间点有降水,但如果在一个事件中存在一定长度的间隙,我想定义降雨事件。 我使用以下代码通过滚动窗口解决了这个问题

gap_to_ignore=1  
prec_dataH['event_ind']=prec_dataH['prec_ind'].rolling(window=(1+2*gap_to_ignore), center=True).max().dropna()

通过这样做,每当有降水时,我会得到一个 event_ind 为 1 的事件,并且在雨事件中的 2 小时休息时间,以及在雨事件前 1 小时和雨事件后 1 小时的时间戳。我现在想提前 1 小时和雨后删除这个。我管理这个

1.) 为 event_ind 中发生的每个更改提供一个连续编号

prec_dataH['event_no'] = (prec_dataH['event_ind'].shift(1) != prec_dataH['event_ind']).astype(int).cumsum()

2.) 为 event_no 分配干燥期的 NaN 值

def reorder_eventNumbers_dryStart (event_numbers):
    if event_numbers % 2 !=0:
        return event_numbers/2
    else:
        return np.NaN

def reorder_eventNumbers_rainStart (event_numbers):
    if event_numbers % 2 ==0:
        return event_numbers/2
    else:
        return np.NaN

if prec_dataH.ix[1, 'event_ind']==1.:

    prec_dataH['event_no']=prec_dataH['event_no'].apply(reorder_eventNumbers_rainStart)
elif prec_dataH.ix[1, 'event_ind']==0.:
    prec_dataH['event_no']=prec_dataH['event_no'].apply(reorder_eventNumbers_dryStart)

3.) 按 event_no 分组,遍历组并将 NaN 值分配给提前 1 小时和降水事件后 1 小时的值,最后将组连接到新的 DataFrame。

这是相当耗时的,因此会发生 SettingWighCopyWarning,我不明白为什么会发生这种情况。

A value is trying to be set on a copy of a slice from a DataFrame.

这是我使用的代码:

rainEvents=prec_dataH.groupby('event_no')

groups=[]
for name, group in rainEvents:
    group.ix[0:gap_to_ignore,'event_ind'] =np.NaN
    group.ix[0:gap_to_ignore,'event_no'] =np.NaN
    group.ix[-gap_to_ignore:, 'event_ind']=np.NaN
    group.ix[-gap_to_ignore:,'event_no'] =np.NaN
    groups.append(group)

rainEvents_corrected=pd.concat(groups)

那么如何避免这种 SettingWithCopyWarning 以及如何让我的代码更高效??

提前致谢, 阿克塞尔

【问题讨论】:

  • group = group.copy() 添加为for 循环的第一行。这摆脱了SettingWithCopyWarning 并加快了您的计算速度。
  • 感谢您的回答,这大大加快了计算速度。但是有没有更好的方法从 groupby 对象中取出 DataFrame 或应用过滤器而不是 for 循环?

标签: python pandas dataframe


【解决方案1】:

添加group = group.copy() 作为for 循环的第一行。这样就摆脱了SettingWithCopyWarning 并将您的计算速度提高了约 60 倍。

def approach1():
    rainEvents=prec_dataH.groupby('event_no')

    groups=[]
    for name, group in rainEvents:
        group.ix[0:gap_to_ignore,'event_ind'] =np.NaN
        group.ix[0:gap_to_ignore,'event_no'] =np.NaN
        group.ix[-gap_to_ignore:, 'event_ind']=np.NaN
        group.ix[-gap_to_ignore:,'event_no'] =np.NaN
        groups.append(group)

    rainEvents_corrected=pd.concat(groups)


def approach2():
    rainEvents=prec_dataH.groupby('event_no')

    groups=[]
    for name, group in rainEvents:
        group = group.copy()
        group.ix[0:gap_to_ignore,'event_ind'] =np.NaN
        group.ix[0:gap_to_ignore,'event_no'] =np.NaN
        group.ix[-gap_to_ignore:, 'event_ind']=np.NaN
        group.ix[-gap_to_ignore:,'event_no'] =np.NaN
        groups.append(group)

    rainEvents_corrected=pd.concat(groups)

%timeit approach1()    # => 1 loop, best of 3: 1min 29s per loop
%timeit approach2()    # => 1 loop, best of 3: 1.42 s per loop

您可以通过在您的 groupby 对象上使用具有适当功能的 .apply() 来避免 for 循环(它基本上模仿了您的 for 循环的主体)。与上述相比,它似乎提供了 20-30% 的加速。

def approach3():
    def correct_rainEvents(g):
        g.ix[:gap_to_ignore, ['event_ind', 'event_no']] = np.nan
        g.ix[-gap_to_ignore:, ['event_ind', 'event_no']] = np.nan
        return g

    rainEvents_corrected = (prec_dataH.groupby('event_no')
                                      .apply(correct_rainEvents)
                                      .reset_index(level='event_no', drop=True))

%timeit approach3()    # => 1 loop, best of 3: 1.12 s per loop 

【讨论】:

    猜你喜欢
    • 2017-05-04
    • 2015-07-30
    • 2019-09-12
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2015-08-12
    • 2017-09-14
    相关资源
    最近更新 更多