如何按列值的计数进行分组并对其进行排序?

时间:2017-07-09 04:44:58

标签: python pandas sorting count group-by

如何按列值的计数进行分组并对其进行排序?

我是一名熊猫学习者。

我有一个名为data.log的原始数据框。现在我想用'c-ip-1'计算数字组,并对结果进行排序。

原始data.log:

   sc-status  sc-substatus  sc-win32-status  time-taken       c-ip-1
0        200             0                0         986  31.7.188.55
1        200             0                0        2539  31.7.188.55
2        200             0                0        1172  31.7.188.56
3        200             0                0        3152  31.7.188.80
4        200             0                0        1091  31.7.188.80
...
99       200             0                0        1115  31.9.200.60
100      200             0                0        2000  31.9.200.61

预期结果如下:

         c-ip-1                 count
0        31.7.188.56            1     
1        31.9.200.61            1  
2        31.7.188.55            2  
...
34       31.9.200.60            5

我尝试编写python代码并运行它,但它失败了:

import pandas as pd

df = pd.read_table('data.log', sep=" ")

print(df[['c-ip-1']].groupby(['c-ip-1']).agg(['count'])

如何使用python解决问题?

2 个答案:

答案 0 :(得分:2)

我认为您需要按GroupBy.size,然后Series.sort_values和最后Series.reset_index进行汇总:

#better is more general separator `\s+` - one or more whitespaces
df = pd.read_table('data.log', sep="\s+")

df1 = df.groupby('c-ip-1').size().sort_values().reset_index(name='count')
print (df1)
        c-ip-1  count
0  31.7.188.56      1
1  31.9.200.60      1
2  31.9.200.61      1
3  31.7.188.55      2
4  31.7.188.80      2

What is the difference between size and count in pandas?

答案 1 :(得分:0)

您可以使用ascending=False。默认情况下,它按计数大小的降序排序。您可以传递参数df['c-ip-1'].value_counts(ascending=True) \ .rename_axis('c-ip-1').reset_index(name='count') c-ip-1 count 0 31.9.200.61 1 1 31.9.200.60 1 2 31.7.188.56 1 3 31.7.188.55 2 4 31.7.188.80 2 来反转它。然后重命名轴和列

void adddiff(int* a, int* b) {
    int orig_a = *a;
    int orig_b = *b;
    *a = orig_a + orig_b;
    *b = orig_a - orig_b;
}