简体   繁体   English

在pandas中对数据进行分组和排序的最佳方法是什么?

[英]What is the best way to group and sort data in pandas?

Hi I have the dataframe 嗨,我有数据帧

df_warnings

which captures the warnings from a server log, and looks like the below (first 3 rows shown): 它从服务器日志中捕获警告,如下所示(显示前3行):

URI code    method  tid type
date                    
2017-06-20  URI: /app/faces/pages/oversight/Oversight.jspx  ADFC-64001  oracle.adfinternal.controller.state.ControllerState tid: [ACTIVE].ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)' WARNING
2017-06-20  URI: /app/faces/pages/oversight/Oversight.jspx  ADFC-64001  oracle.adfinternal.controller.state.ControllerState tid: [ACTIVE].ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)' WARNING
2017-06-20  URI: /app/faces/pages/oversight/Oversight.jspx  ADFC-64001  oracle.adfinternal.controller.state.ControllerState tid: [ACTIVE].ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)' WARNING

The 'code' & 'method' columns are strings. 'code'和'method'列是字符串。 What I would like to do is : 我想做的是:

  • group the 'method' values by the 'code' value (ie I would like to see the methods and the counts of those methods against each code) 通过'code'值对'method'值进行分组(即我希望看到针对每个代码的方法和这些方法的计数)

  • group the counts of each method within each code group in descending order 按降序对每个代码组中每个方法的计数进行分组

  • order the groups (codes) in descending order 按降序排列组(代码)

  • only show the top 3 methods & counts in each code group 仅显示每个代码组中的前3个方法和计数

What is the best way to do this? 做这个的最好方式是什么?

EDIT: I have tried 编辑:我试过了

df_warnings['method'].groupby(df_warnings['code']).value_counts()

Which gives me the methods & method counts binned by code; 这给了我按代码分类的方法和方法计数; however it doesnt give me the top 3 methods & methods counts in each code bin, and code bins are not ordered in descending order of total count in the bin 但它并没有给我每个代码箱中的前3个方法和方法计数,并且代码箱没有按照bin中总计数的降序排序

EDIT2: output I would like EDIT2:输出我想

 code method count code1 A 100 B 50 C 5 D 2 code2 A 50 B 10 code3 C 50 D 5 

In the above code1 code2 and code3 are sorted in terms of total count in each (157, 60 and 55 respectively) and then the methods & counts are sorted within each group 在上面的代码1中,code2和code3按照每个的总计数(分别为157,60和55)进行排序,然后在每个组中对方法和计数进行排序

Thanks in advance! 提前致谢!

I think you need groupby + value_counts for count and then SeriesGroupBy.nlargest : 我认为你需要groupby + value_counts进行计数,然后是SeriesGroupBy.nlargest

d = {'method': ['C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'D', 'D', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'D'], 'code': ['code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3']}
df = pd.DataFrame(d)

print (df.head())
    code method
0  code1      C
1  code1      C
2  code1      C
3  code1      C
4  code1      C


df2 = df.groupby(['code'])['method'].value_counts()
print (df2)
code   method
code1  C         100
       A          50
       B           5
       D           2
code2  C          50
       A          10
code3  C          50
       D           5
Name: method, dtype: int64

df2 = df.groupby(['code'])['method'].value_counts().sort_index()
print (df2)
code   method
code1  A          50
       B           5
       C         100
       D           2
code2  A          10
       C          50
code3  C          50
       D           5
Name: method, dtype: int64

#in real data change 2 to 3
df2 = df2.groupby(level='code',group_keys=False ).nlargest(2)
print (df2)
code   method
code1  C         100
       A          50
code2  C          50
       A          10
code3  C          50
       D           5
Name: method, dtype: int64

EDIT: 编辑:

I try a bit explain sort_values by samples (I think this answer it explain better, although it is not pandas.): 我尝试通过样本解释sort_values (我认为这个答案更好地解释,虽然它不是熊猫。):

d = {'method': ['C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'D', 'D', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'D'], 'code': ['code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code1', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code2', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3', 'code3']}
df = pd.DataFrame(d)
#print (df.head())

df3 = df.groupby(['code'])['method'].value_counts().reset_index(name='vals')
#some random shuffle of rows
a = df3.index.values
np.random.seed(88)
np.random.shuffle(a)
df3 = df3.reindex(a).sort_index()
print (df3)
    code method  vals
0  code3      D     5
1  code2      A    10
2  code2      C    50
3  code1      A    50
4  code1      C   100
5  code1      B     5
6  code1      D     2
7  code3      C    50

print (df3.sort_values(['code']))
    code method  vals
3  code1      A    50
4  code1      C   100
5  code1      B     5
6  code1      D     2
1  code2      A    10
2  code2      C    50
0  code3      D     5
7  code3      C    50

print (df3.sort_values(['method']))
    code method  vals
1  code2      A    10
3  code1      A    50
5  code1      B     5
2  code2      C    50
4  code1      C   100
7  code3      C    50
0  code3      D     5
6  code1      D     2

print (df3.sort_values(['vals'], ascending=False))
    code method  vals
4  code1      C   100
2  code2      C    50
3  code1      A    50
7  code3      C    50
1  code2      A    10
0  code3      D     5
5  code1      B     5
6  code1      D     2

#if sorting by multiples columns it sort all columns separately:
#so first sort all values in df by first column, then sort by second and last by 3. col
print (df3.sort_values(['code','method']))
    code method  vals
3  code1      A    50
5  code1      B     5
4  code1      C   100
6  code1      D     2
1  code2      A    10
2  code2      C    50
7  code3      C    50
0  code3      D     5

print (df3.sort_values(['code','vals'], ascending=[True, False]))
    code method  vals
4  code1      C   100
3  code1      A    50
5  code1      B     5
6  code1      D     2
2  code2      C    50
1  code2      A    10
7  code3      C    50
0  code3      D     5

print (df3.sort_values(['method', 'vals'], ascending=[True, False]))
    code method  vals
3  code1      A    50
1  code2      A    10
5  code1      B     5
4  code1      C   100
2  code2      C    50
7  code3      C    50
0  code3      D     5
6  code1      D     2

print (df3.sort_values(['vals', 'method'], ascending=[False, True]))
    code method  vals
4  code1      C   100
3  code1      A    50
2  code2      C    50
7  code3      C    50
1  code2      A    10
5  code1      B     5
0  code3      D     5
6  code1      D     2

print (df3.sort_values(['vals', 'method', 'code'], ascending=[True, False, False]))
    code method  vals
6  code1      D     2
0  code3      D     5
5  code1      B     5
1  code2      A    10
7  code3      C    50
2  code2      C    50
3  code1      A    50
4  code1      C   100

print (df3.sort_values(['code', 'method', 'vals'], ascending=[True, False, True]))
    code method  vals
6  code1      D     2
4  code1      C   100
5  code1      B     5
3  code1      A    50
2  code2      C    50
1  code2      A    10
0  code3      D     5
7  code3      C    50 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM