根据python数据帧中列的状态变化将时间序列数据拆分为组

根据python数据帧中列的状态变化将时间序列数据拆分为组,python,pandas,Python,Pandas,我需要在pandas数据帧中对一些数据进行分组,但标准分组方法并不能满足我的需要。它必须分组,以便将“loc”和/或“名称”中的每一项变更视为一个单独的分组 榜样 x = pd.DataFrame([['john','abc',1],['john','abc',2],['john','abc',3],['john','xyz',4],['john','xyz',5],['john','abc',6],['john','abc',7],['matt','abc',8]]) x.columns =

我需要在pandas数据帧中对一些数据进行分组,但标准分组方法并不能满足我的需要。它必须分组,以便将“loc”和/或“名称”中的每一项变更视为一个单独的分组

榜样

x = pd.DataFrame([['john','abc',1],['john','abc',2],['john','abc',3],['john','xyz',4],['john','xyz',5],['john','abc',6],['john','abc',7],['matt','abc',8]])
x.columns = ['name','loc','time']

name    loc  time
john    abc  1
john    abc  2
john    abc  3
john    xyz  4
john    xyz  5
john    abc  6
john    abc  7
matt    abc  8
我需要将这些值分组,以便生成的数据

name    loc  first last
john    abc  1     3
john    xyz  4     5
john    abc  6     7
matt    abc  8     8
默认分组函数(正确)将所有loc和name值分组,因此只剩下3个组(john/abc为1个组)。有人知道如何强制分组吗?我要求如何分组

我能够使用for循环(iterrows)生成所需的表,但是如果有一种很好的pandas pythonic方法来做同样的事情,我很想知道

先谢谢你


Matt

这实际上不是
groupby
的工作,因为行的顺序很重要。相反,使用
shift
比较连续的行

In [37]: cols = ['name', 'loc']

In [38]: change = (x[cols] != x[cols].shift(-1)).any(1).shift(1).fillna(True)

In [39]: groups = x[change]

In [40]: groups.columns = ['name', 'loc', 'first']

In [41]: groups['last'] = (groups['first'].shift(-1) - 1).fillna(len(x))

In [42]: groups
Out[42]:
   name  loc  first  last
0  john  abc      1     3
3  john  xyz      4     5
5  john  abc      6     7
7  matt  abc      8     8

[4 rows x 4 columns]

您可以使用
分组方式中的函数

x = pd.DataFrame([['john','abc',1],['john','abc',2],['john','abc',3],['john','xyz',4],['john','xyz',5],['john','abc',6],['john','abc',7],['matt','abc',8]])
x.columns = ['name','loc','time']

last_group = None
c =0
def f(y):
    global c,last_group
    g = x.irow(y)['name'],x.irow(y)['loc']
    if last_group != g:
        c += 1
        last_group = g
    return c

print x.groupby(f).head()

为了确定,您是否希望结果中倒数第二行,即第二行
('john','abc')
行。我知道Github上有一个关于连续
groupby
s的问题,我会看看是否能找到它。