所以我有以下DataFrame df:
该框架包含两组在该组内排序的数据。
第1组来自指数359至365(含)(
)第2组来自索引366至371,包括
我想将它们分成两组。可能有两个以上的小组。我申请的逻辑是每当下一个STEPS_ID小于当前的STEPS_ID时,这标志着该组的结束。
我很容易通过df.STEPS_ID< = df.STEPS_ID.shift(-1)
获得此指针是否有一种优雅的熊猫方式可以轻松地实现这一点,可能使用矢量化操作而不是循环?
这似乎是一个很常见的问题,我确信必须有一个明确定义的算法来解决这些问题。如果你们能够指导我阅读这些算法的理论基础,我也将不胜感激。
答案 0 :(得分:4)
“将事物分成小组”的方法不止一种。一种方法是制作一个组列表。但这不是处理Pandas DataFrame时的理想方式。一旦有了列表,就不得不在Python循环中遍历列表。与本地熊猫业务相比,这些相对较慢。
假设您有足够的内存,更好的方法是向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')....