嗨,我有数据框
df_warnings
从服务器日志中捕获警告,如下所示(显示前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
'代码' &安培; '方法'列是字符串。我想做的是:
对'方法进行分组' '代码'的值值(即我希望看到针对每个代码的方法和方法的计数)
按降序对每个代码组中每种方法的计数进行分组
按降序排列组(代码)
仅显示前三种方法&每个代码组中的计数
这样做的最佳方式是什么?
编辑:我试过了df_warnings['method'].groupby(df_warnings['code']).value_counts()
这给了我方法&方法计数按代码分类;但它没有给我前3种方法和方法在每个代码箱中计数,并且代码箱不按箱中总计数的降序排序
EDIT2:输出我想要
code method count
code1 A 100
B 50
C 5
D 2
code2 A 50
B 10
code3 C 50
D 5

在上面的代码1中,代码2和代码3按每个代表的总计数(分别为157,60和55)进行排序,然后是方法&计数在每组中排序
提前致谢!
答案 0 :(得分:3)
我认为您需要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
编辑:
我尝试通过样本解释sort_values
(我认为this更好地回答它解释,虽然它不是熊猫。):
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