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

2024-04-19 11:04:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在一个数据帧中对一些数据进行分组,但是标准的分组方法并不能完全满足我的需要。它必须分组,以便将“loc”中的每个更改和/或“name”中的每个更改视为一个单独的组。你知道吗

举例说明

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方法来做同样的事情,我很想知道。你知道吗

先谢谢你。你知道吗

马特


Tags: columns数据方法namedataframe标准timematt
2条回答

可以在groupby中使用函数:

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()

这实际上不是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]

相关问题 更多 >