一、 groupby
1. 关键词形式
用来聚集的关键词有多种形式,而且关键词可以不用是同一种结构。
a. list或array,长度需与将被聚集的轴向长度一样
b. DataFrame中的列名
c. Dict或Series,其值与将被聚集的轴向值一一对应
d. 函数
2. 聚集实例
首先创建一个DataFrame以供演示,
对data1按key1进行聚集,聚集后得到的结果需要以数学计算类方式显示,有点类似于SQL,没有被函数计算的列均需在group by 中。
对于groupby后关键词,key1为列名,并且仅对data1进行了聚集,如果是data1和data2同时按key1进行聚集,则直接对df进行groupby,数值类的列会默认被聚集,而其他类型的不会。
注:df.groupby('key1')['data1']和df['data1'].groupby(df['key1'])相比,结果一致,但前者在语法上更为优,特别是对于大的数据集来说。
如果key1,key2同时出现即groupby([df['key1'], df['key2']]),所聚集的结果将是多索引DataFrame,grouped.unstack()会将key2转成列名,如果不希望聚集的关键词作为索引,可在groupby的参数中添加 as_index=False。
聚集的关键词可以是长度一致的外部Series,如下:
3. 聚集结果的叠代与应用
a. 叠代打印出数据块
b. 转换成其他数据结构
c. 聚集方向
默认情况下聚集是在axis=0,但可以任意选择其他轴向,如下例选择以数据类型在列的方向进行聚集,
4. 其他关键词类型的聚集
(Dicts, Series, Functions, Index Levels)
创建数据集,并替换些空值。
a. Dicts
创建字典,其中多添加了一列原DataFrame不存在的f用作参考,匹配的是列值,可直接将字典传入关键词,设置参数axis=1,
b. Series
接着上面的例子,将字典转换成Series,并以同样的方式进行groupby,
c. Functions
被传入作关键词的函数,会针对每一个索引都被执行一次,我们以len为例说明,第二个例子也展示了函数与list混合作为关键词。
d. Index Levels
对于多层级的DataFrame,可以按索引级别进行groupby,
5. 聚集后的数据处理
a. 数据函数:
count, sum, mean, median, std, var, min, max, prod, first, last.
quantile(), Series计算方式,例 df.groupby('key1')['data1'].quantile(0.9)
b. 可设计函数再调用,如下,其中df.agg()中agg是aggregate的缩写
c. 调用的函数可以是多个函数的list
grouped_pct.agg(['mean', 'std', peak_to_peak])
也可以指定不同列按照不同的函数进行处理,
grouped_pct.agg([('foo', 'mean'), ('bar', np.std)]),
对列foo计算mean, 对列bar计算std。
同时,也可以对返回的计算列进行命名,
ftuples = [('Durchschnitt', 'mean'), ('Abweichung', np.var)]
grouped['tip_pct', 'total_bill'].agg(ftuples)
对列'tip_pct'和 'total_bill'进行mean和var的计算,但计算列名分别显示为'Durchschnitt'和'Abweichung',
对于聚集处理后的数据,要想保持DataFrame的特性,需要用reset_index()转换一下,即
df = grouped.reset_index()
二、pivot_table
同样具有聚集作用,但返回的结果默认是mean, 另外不同于groupby的是,pivot_table可以通过参数margins添加求和行和列。
tips.pivot_table(['tip_pct', 'size'], index=['time', 'day'], columns='smoker')
选择列'tip_pct', 'size',行索引'time', 'day',按是否为'smoker'对列进行区分展示平均值。
tips.pivot_table(['tip_pct', 'size'], index=['time', 'day'], columns='smoker', margins=True)
通过参数margins=True来选择对两列的每行进行平均值的计算,且在最后一行为每单列的平均值。
tips.pivot_table('tip_pct', index=['time', 'smoker'], columns='day', aggfunc=len, margins=True)
参数aggfunc可设置聚集计算的方式,譬如count或len会返回该部分数据块的数量。
参数fill_value可用来设置针对空值来填空的默认值,如fill_value=0, 同理,dropna用来选择是否去除全部为空值的列,默认为True。
该文章内容主要来自于《Python for Data Analysis》第10章,原本是边读边练习过,可是一到应用时还是有点分不清,通过这样整理希望能够加深印象,使得应用起来更加熟练。