数据处理的最后一步为数据聚合,通常指的是转换数据,是每一个数组生成一个单一的数值。我们已经做过多种数据聚合操作,例如sum( )、mean( )和count( )。这些函数均是操作一组数据,得到的结果只有一个数值。然而,对数据进行分类等聚合操作更为正式,对数据的控制力更强。
对分组进行一系列的操作,内置聚合函数
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],
'key2': ['one', 'two', 'one', 'two', 'one'],
'data1': np.random.randint(1, 10, 5),
'data2': np.random.randint(1, 10, 5)})
print(df.groupby('key1').describe())
data1 ... data2
count mean std min 25% 50% ... std min 25% 50% 75% max
key1 ...
a 3.0 3.0 2.645751 1.0 1.50 2.0 ... 1.732051 2.0 2.0 2.0 3.5 5.0
b 2.0 3.5 3.535534 1.0 2.25 3.5 ... 5.656854 1.0 3.0 5.0 7.0 9.0
grouped = df.groupby('key1')
print(grouped)
d = {'data1': 'mean',
'data2': 'sum'}
print(grouped.agg(d))
data1 data2
key1
a 6.666667 16
b 1.500000 6
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],
'key2': ['one', 'two', 'one', 'two', 'one'],
'data1': np.random.randint(1, 10, 5),
'data2': np.random.randint(1, 10, 5)})
k1_mean = df.groupby('key1').mean().add_prefix('mean_')
print(k1_mean)
mean_data1 mean_data2
key1
a 6.0 3.0
b 3.5 4.5
两个表进行合并
print(pd.merge(df, k1_mean, left_on='key1', right_index=True))
key1 key2 data1 data2 mean_data1 mean_data2
0 a one 9 9 7.333333 6.0
1 a two 8 1 7.333333 6.0
4 a one 5 8 7.333333 6.0
2 b one 1 2 5.000000 4.0
3 b two 9 6 5.000000 4.0
第二种方法
k1_mean = df.groupby('key1').transform(np.mean)
print(k1_mean)
data1 data2
0 7.0 4.333333
1 7.0 4.333333
2 5.5 7.000000
3 5.5 7.000000
4 7.0 4.333333
新加两个列
df[k1_mean.columns] = k1_mean
print(df)
key1 key2 data1 data2
0 a one 7 5.333333
1 a two 7 5.333333
2 b one 3 3.000000
3 b two 3 3.000000
4 a one 7 5.333333
df = pd.DataFrame(np.random.randint(1, 10, (5, 5)),
columns=['a', 'b', 'c', 'd', 'e'],
index=['Alice', 'Bob', 'Candy', 'Dark', 'Emily'])
def demean(s):
return s - s.mean()
key = ['one', 'one', 'two', 'one', 'two']
demean = df.groupby(key).transform(demean)
print(demean)
a b c d e
Alice -0.666667 2.333333 -0.333333 1.666667 2.333333
Bob -1.666667 2.333333 0.666667 -1.333333 2.333333
Candy 0.000000 2.000000 1.500000 -0.500000 -0.500000
Dark 2.333333 -4.666667 -0.333333 -0.333333 -4.666667
Emily 0.000000 -2.000000 -1.500000 0.500000 0.500000
apply方法进行分组
某一个排序输出最大的前两行
def top(g, n=2 ,column='data1'):
return g.sort_values(by=column, ascending=False)[:n]
top(df)
key1 key2 data1 data2
0 a one 9 9
5 a one 9 9