在满足列条件后,Pandas会截断DataFrame

时间:2013-09-05 12:18:15

标签: python pandas

所以我有以下DataFrame df:

enter image description here

该框架包含两组在该组内排序的数据。

第1组来自指数359至365(含)(

第2组来自索引366至371,包括

我想将它们分成两组。可能有两个以上的小组。我申请的逻辑是每当下一个STEPS_ID小于当前的STEPS_ID时,这标志着该组的结束。

我很容易通过df.STEPS_ID< = df.STEPS_ID.shift(-1)

获得此指针

是否有一种优雅的熊猫方式可以轻松地实现这一点,可能使用矢量化操作而不是循环?

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

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')....