2014-01-16 42 views
2

我需要将熊猫数据框中的一些数据分组,但标准分组方法并不完全符合我的需要。它必须组合,以便“loc”中的每个更改和/或“name”中的每个更改都被视为一个单独的组。基于python熊猫数据框中列的状态变化将时间序列数据分组到组中

示例;

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 

默认分组(正常)工作组中的所有所以我们只剩下3组禄和名称值(约翰福音/ abc是1组)。有人知道如何强制分组,我怎么需要它?

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

预先感谢您。

马特

+0

只是为了确保,你想要的倒数第二行中的结果,第二个'(“约翰”,“ABC” )'行。我知道Github上有一个关于连续“groupby”的问题,我会看看我能否找到它。 – TomAugspurger

回答

0

这是不是真的为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] 
0

您可以使用在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() 
相关问题