在数据分析中,经常需要对数据集进行分类,并在每一组上应用一个聚合函数或转换函数,pandas提供一个灵活的groupby接口,可以方便得进行数据聚合和分组操作。(函数的解释在代码块内部)
GroupBy机制
之前在学习R的时候,已经接触过拆分-应用-联合,原理是差不多的。
下面结合例子来学习groupby。
import numpy as np
import pandas as pd
#生成dataframe
df = pd.DataFrame({"k1":["va","va","vb","vb","vc"],
"k2":["vf","vf","vs","vt","vt"],
"d1":np.random.randn(5),
"d2":np.random.randn(5)})
df
Out:
#根据k1标签对d1进行分组
df_grouped = df["d1"].groupby(df["k1"])
df_grouped
Out:
此时的df_grouped变量是一个GroupBy对象。
#对每一组求均值
df_grouped.mean()
Out:
#通用的GroupBy方法是size,size方法返回一个包含组大小信息的Series
df.groupby(["k1"]).size()
size计数时包含NaN值,而count不包含NaN值
Out:
for name,group in df.groupby("k1"):
print(name)
print(group)
GroupBy对象支持迭代,会生成一个包含组名和数据块的2维元组序列
Out:
数据聚合
#对整个df进行分组时,列名可以作为参数
grouped2 = df.groupby("k1")
grouped2["d1"].quantile(0.9)
Out:
#如果要使用自己定义的聚合函数,需要将函数传递给aggregate或agg方法
def peak_to_peak(arr):
return arr.max() - arr.min()
grouped2.agg(peak_to_peak)
Out:
分位数
pd.cut(data, bins, labels = None, duplicated = “raise”)
bins表示要将x划分为多少个等间距的区间;
labels设置区间的名称,若参数值为False则返回整数填充的区间名;
duplicates参数值为drop,则直接删除非唯一值。
pd.qcut(data, q, labels = None, duplicated = “raise”)
q为分位数。
df2 = pd.DataFrame({"data1":np.random.randint(20, 70, 10),
"data2":["A","A","B","A","B","B","B","A","A","B"]})
df2
Out:
#pd.cut用于将数据按照选择的箱位进行分桶
quartiles = pd.cut(df2.data1 , bins = 4)
quartiles
#pd.qcut可以将数据按照选择的样本分位数进行分桶,每份的数据量相同
pd.qcut(df2.data1,4)
Out:
交叉表
pd.crosstab(quartiles, df2["data2"])
Out:
在学习的过程中,发现了一篇博文写的不错,在这里分享给大家点击这里进行学习