1、groupby机制
首先创建相关DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame({'key1':['a','a','b','b','a'],
'key2':['one','two','one','two','one'],
'data1': np.random.randn(5),
'data2': np.random.randn(5)})
df
输出
如果想要根据key1标签来计算data1列的均值,有多种方法可以实现。其中一种是访问data1并使用key1列调用groupby方法。
grouped = df['data1'].groupby(df['key1'])
grouped.mean()
输出
key1
a 0.767080
b -0.124782
Name: data1, dtype: float64
如果将多个数组作为列表传入groupby,我们会得到不一样的结果。
means = df['data1'].groupby([df['key1'], df['key2']]).mean()
means
输出一个双层索引
key1 key2
a one 0.974100
two 0.353039
b one 0.481500
two -0.731065
Name: data1, dtype: float64
2、数据聚合
如果使用自己的函数来聚合,可以使用agg与aggregate方法
grouped = df.groupby('key1')
def peak_to_peak(arr):
return arr.max()-arr.min()
grouped.agg(peak_to_peak)
输出
也可以将方法组成的列表带入agg,对原DataFrame进行操作。
functions = ['count','mean','max']
grouped['data1','data2'].agg(functions)
输出
可以传递具有自定义名称的元组列表。字典同理。
ftuples = [('DDD','mean'),('AAA',np.var)]
grouped.agg(ftuples)
如果你想索引不是键值的话,可以使用as_index=False.
df.groupby(['key1'], as_index=False).mean()
3、拆分、合并
构造扑克牌
#红桃 黑桃 梅花 方块
suits = ['H','S','C','D']
card_val = (list(range(1,11)) + [10]*3)*4
base_names = ['A'] + list(range(2,11))+['J','K','Q']
cards = []
for suit in ['H','S','C','D']:
cards.extend(str(num) + suit for num in base_names)
deck = pd.Series(card_val, index=cards)
deck[:13]
从这幅牌中拿出五张
def draw(deck,n=5):
return deck.sample(n)
draw(deck)
假设我们要在每个花色中抽取两张牌,因为花色是牌名最后一个字符,我们可以基于这点进行分组。
get_suit = lambda card: card[-1]
deck.groupby(get_suit).apply(draw, n=2)#groupby默认索引 如索引为2D card[-1]就为D
以上就是第十章数据聚合相关内容。