2013-09-05 199 views
1

所以我有以下的数据帧DF:熊猫截断数据帧

enter image description here

的帧包含数据的两个组被该组中的排序。

组1是从索引359至365包容

组2是从索引366至371包容

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

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

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

这似乎是一个常见的问题,我相信必须有一个明确的算法来解决这类问题。我也希望你们能指导我阅读这些算法的理论基础。

+2

对于将来的问题,它会使* far *回答更容易,如果您粘贴Dat aFrame作为文本(使用Ctrl-K缩进4个空格),而不是图像(无法复制和粘贴)。 –

回答

4

有多种方法可以“将事物分组”。一种方法是制作一个组列表。但是,这不是处理熊猫DataFrame的理想方式。一旦你有了一个列表,你就不得不在Python循环中遍历列表。与本地熊猫业务相比,这些速度相对较慢。

假设你有足够的内存,更好的办法是一个列或索引添加到数据帧:

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

dang,打我吧。另外,这个黑客攻击在master中是固定的(所以你不必再在0.13中做) –