分组行pandas

时间:2018-03-26 03:48:58

标签: python pandas grouping rows pandas-groupby

后台:我有以下数据框:

import pandas as pd
d = {'day': ["t", "m", "m", "w", "t", "m","w"], 
     'month': ["01", "01", "01", "01", "02","02","02"], 
     'count': [1, 1, 1, 1,1,1,1]}
df = pd.DataFrame(data=d)

我按daymonth分组:

df.groupby(by=['day','month']).count()

输出:

day  month count    
m    01     2
     02     1
t    01     1
     02     1
w    01     1
     02     1

从这里开始,我想组织数据以获得以下输出:

期望输出:

day  month count    
m    01     2
t    01     1
w    01     1
m    02     1
t    02     1
w    02     1           

我尝试了df.sort_values('month')df.sort_values('day'),但它并没有给我提供我想要的东西

问题:我需要添加哪些代码才能获得所需的输出?

4 个答案:

答案 0 :(得分:3)

你走了。它恰好只能使当天订购正确,但如果你有更多的日子,你可能想要将它们转换为实际的0-6天。

df.groupby(by=['day','month'], as_index=False).count().sort_values(by=['month', 'day'])

    day month   count
0   m   01  2
2   t   01  1
4   w   01  1
1   m   02  1
3   t   02  1
5   w   02  1

答案 1 :(得分:2)

sort_indexlevel参数一起使用:

df.groupby(by=['day','month']).count().sort_index(level=1)

输出:

           count
day month       
m   01         2
t   01         1
w   01         1
m   02         1
t   02         1
w   02         1

和reset_index如果你愿意的话。

df.groupby(by=['day','month']).count().sort_index(level=1).reset_index()

  day month  count
0   m    01      2
1   t    01      1
2   w    01      1
3   m    02      1
4   t    02      1
5   w    02      1

答案 2 :(得分:2)

groupby会自动对索引进行排序。相反,切换您要分组的顺序,然后交换级别

df.groupby(by=['month', 'day']).count().swaplevel(0, 1)

           count
day month       
m   01         2
t   01         1
w   01         1
m   02         1
t   02         1
w   02         1

答案 3 :(得分:1)

import pandas as pd
d = {'day': ["t", "m", "m", "w", "t", "m","w"], 
     'month': ["01", "01", "01", "01", "02","02","02"], 
     'count': [1, 1, 1, 1,1,1,1]}
df = pd.DataFrame(data=d)

df.groupby(['day','month']).count().reset_index()
  

输出(您现在可以应用sort()

    day month count
0   m    01    2

1   m    02    1

2   t    01    1

3   t    02    1

4   w    01    1

5   w    02    1