2016-03-16 51 views
2

我有一个ID,名称,日期时间和值的数据框。当我使用此DF的dtypes时,我得到根据时间变量对分组数据帧进行排序colum

ID - int64 
time - object 
value - int 

我想按ID对数据帧进行分组,然后按时间顺序对行进行排序。我尝试以下,

df['time'] = pd.to_datetime(df['time']) 
p= df.groupby(['ID']) 

然后我尝试,

p.sort_values(['time']) 

但得到一个错误,

AttributeError: Cannot access callable attribute 'sort_values' of 'DataFrameGroupBy' objects, try using the 'apply' method 

所以后来我试过了,

p['time'].apply(lambda x: x.sort_values()) 

,这似乎只为该专栏工作。我无法对所有列进行排序。我想在分组ID后根据时间变量对整个数据帧进行排序。我知道这可能很容易。但一直在尝试它很长一段时间没有任何结果。有人能帮我做这件事吗?

+0

@jezrael这是一个ID作为单行和行数以前的列数和丢失所有其他列。这是不正确的。 – Observer

+0

嗯,你是对的。 (''ID'])。apply(lambda x:x ['time']。sort_values())。reset_index() ' – jezrael

回答

1

在你的具体情况下,你不能只是排序而不是groupby?例如。

>>> df 
    ID  time value 
0 1 2016-03-05  10 
1 1 2016-01-04  20 
2 2 2015-05-05  30 
3 3 2016-01-02  40 
>>> df.dtypes 
ID    int64 
time  datetime64[ns] 
value    int64 
dtype: object 
>>> df.sort_values(["ID", "time"]) 
    ID  time value 
1 1 2016-01-04  20 
0 1 2016-03-05  10 
2 2 2015-05-05  30 
3 3 2016-01-02  40 

这将基于对(ID,时间)每行的2元组重点对它们进行排序,并以同样的方式将工作,即使有多个value样列:

>>> df.sort_values(["ID", "time"]) # different df 
    ID  time value value2 
1 1 2016-01-04  20  200 
0 1 2016-03-05  10  100 
2 2 2015-05-05  30  300 
3 3 2016-01-02  40  400 
+0

谢谢。它运作良好。非常简单的做法。 – Observer

相关问题