如何按列值的计数进行分组并对其进行排序?
我是一名熊猫学习者。
我有一个名为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解决问题?
答案 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
答案 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;
}