繁体   English   中英

Pandas 在 1.4.2 中将索引滚动更改为“on”列?

[英]Pandas rolling changing index to "on" column in 1.4.2?

我已经滚动了自己的代码,让我可以根据时间偏移找到数据帧的所有窗口,这样我以后就可以将函数应用于整个数据帧(与 pandas 中的 vanilla .rolling() 函数相比,它在单个列上运行一次。)我从另一个问题的有用答案中获得灵感。

该解决方案在我的一个环境(使用 pandas 1.3.0 的十六进制笔记本)中按预期工作,但在另一个环境中不起作用(使用 pandas 1.4.2 的 pycharm)。

编辑将我的 pycharm 版本回滚到 1.3.0 后,它按预期工作,所以它要么是在 1.3.0 和 1.4.2 之间引入的东西,要么是我机器上的安装损坏。

关键代码是:

def perform_rolling(df: pd.DataFrame, my_windows: list[tuple]):
    group_id = df[grouping_field_name].unique()[0]
    dfc = df.reset_index(drop=True)
    dfc.drop([grouping_field_name], inplace=True, axis=1)
    dfc.rolling(time_offset, on=time_field_name).apply(assign_windows, kwargs={'my_df': dfc, 'my_windows': my_windows, 'group_id': group_id})

作为参考,assign_windows 函数是:

def assign_windows(ser: pd.Series, my_df: pd.DataFrame, my_windows: list[tuple], group_id):
    my_uids = list(my_df.loc[ser.index, 'uid'].values)
    # Python's rolling implementation will execute assign_windows() on each column, so we
    # restrict action to a single column to avoid duplicating windows.
    if -1 in ser.values:
        my_windows.append((group_id, my_uids))
    return 1  # This is a dummy return because pd.DataFrame.rolling expects numerical return values.

这一切都发生在一个包含 my_windows 列表的闭包中,该列表返回给调用代码。

问题是在我的一个环境中,发送到assign_windows()的系列已将其索引更改回time_field_name列,因此my_df.loc[ser.index, 'uid'].values换行符,因为 my_df 被索引到默认范围索引。

在我的其他环境中,一切都按预期工作,进入assign_windows()的系列仍然具有应用.rolling()时的相同索引。

对于防止 pandas 将序列重新索引到on参数的任何帮助,我们将不胜感激。

事实证明,这是 Pandas 中的一个错误/未记录的更改。 在 rolling().apply() 版本 1.4.1 中添加了强制重新索引的代码:

    def apply_func(values, begin, end, min_periods, raw=raw):
        if not raw:
            # GH 45912
            values = Series(values, index=self._on)
        return window_func(values, begin, end, min_periods)

我已经打开了一个问题,希望他们能找到一个不同的解决方案来解决引发这种变化的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM