根据python数据帧中列的状态变化将时间序列数据拆分为组
我需要在pandas数据帧中对一些数据进行分组,但标准分组方法并不能满足我的需要。它必须分组,以便将“loc”和/或“名称”中的每一项变更视为一个单独的分组 榜样根据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 =
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的问题,我会看看是否能找到它。