1

所以我有以下DataFrame df:

在此处输入图像描述

该框架包含两组数据,这些数据在该组中排序。

第 1 组是从索引 359 到 365(含)

第 2 组是从索引 366 到 371(含)

我想把他们分成两组。可能有两个以上的组。我应用的逻辑是每当下一个 STEPS_ID 小于当前 STEPS_ID 时,这标志着组的结束。

我很容易通过 df.STEPS_ID <= df.STEPS_ID.shift(-1) 得到这个指针

是否有一种优雅的 pandas 方法可以使用矢量化操作而不是 for 循环轻松实现这一目标?

这似乎是一个足够普遍的问题,我确信必须有一个定义明确的算法来解决这类问题。如果你们能指导我阅读此类算法的理论基础,我也将不胜感激。

4

1 回答 1

4

有不止一种方法可以“将事物分成组”。一种方法是制作组列表。但这不是处理 Pandas DataFrame 的理想方式。一旦你有了一个列表,你就不得不在 Python 循环中遍历这个列表。与原生 Pandas 操作相比,这些操作相对较慢。

假设您有足够的内存,更好的方法是向 DataFrame 添加列或索引:

import pandas as pd
df = pd.DataFrame({'STEPS_ID':range(1107,1113)*2})
df['GROUP'] = (df['STEPS_ID'] < df['STEPS_ID'].shift(1)).astype('int').cumsum()
# df.set_index('GROUP', inplace=True, append=True)
print(df)

产量

    STEPS_ID  GROUP
0       1107      0
1       1108      0
2       1109      0
3       1110      0
4       1111      0
5       1112      0
6       1107      1
7       1108      1
8       1109      1
9       1110      1
10      1111      1
11      1112      1

现在您可以通过调用对每个组进行聚合/转换操作

df.groupby('GROUP')....
于 2013-09-05T12:36:15.633 回答