import pandas as pd
import numpy as np
from pandas import DataFrame, Series
'''5.数据聚合
数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。
数据分类处理:
-----分组:先把数据分为几组
-----用函数处理:为不同组的数据应用不同的函数以转换数据
-----合并:吧不同组得到的结果合并起来'''
# 数据分类的核心:groupby()函数
df = DataFrame({"item": ["苹果", "香蕉", "橘子", "香蕉", "橘子", "苹果"],
"price": [4.0, 3.0, 3.0, 2.0, 5.0, 4.0], "color":
["red", "yellow", "yellow", "green", "green", "green"]})
print(df)
g = df.groupby("item") # 得不到具体的数据,需要使用groups
print(g.groups) # 根据索引值来进行分组
print(g["price"].mean()) # 得到各个水平的平均价格
# 整合结果
df_mean = DataFrame(g["price"].mean())
print(df_mean)
df_mean.columns = ["price_mean"]
df_merge = pd.merge(df, df_mean, left_on="item", right_index=True)
print(df_merge)
# 如果想要使用color列索引,计算price的均值,可以先获取到price列,然后调用groupby函数,用参数指定color这一列
# 使用color进行划分
df_color = df.groupby("color").sum()
print(df_color)
# 使用color和item进行分组并求和
print(df.groupby(["color", "item"]).sum()) # 在进行分组的时候,如果多个条件进行分组,那么数据时多层索引
df = DataFrame([{'col1': 'a', 'col2': 1, 'col3': 'aa'}, {'col1': 'b', 'col2': 2, 'col3': 'bb'},
{'col1': 'c', 'col2': 3, 'col3': 'cc'}, {'col1': 'a', 'col2': 44, 'col3': 'aa'}])
print(df)
# 按col1分组并按col2求和
print(df.groupby(by='col1').agg({'col2': sum}).reset_index())
# 按col1分组并按col2求最值
print(df.groupby(by='col1').agg({'col2': ['max', 'min']}).reset_index())
# 按col1 ,col3分组并按col2求和
print(df.groupby(by=['col1', 'col3']).agg({'col2':sum}).reset_index())
# 分组
df1 = DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],
'key2': ['one', 'two', 'one', 'two', 'one'],
'data1': np.arange(5),
'data2': np.arange(5)})
print(df1)
'''根据分组进行计算'''
# 按key1分组,计算data1的平均值
grouped = df1['data1'].groupby(df1['key1'])
print(grouped.mean())
# 按key1和key2分组,计算data1的平均值
grouped_mean = df1['data1'].groupby([df1['key1'], df1['key2']]).mean()
print(grouped_mean)
# 列变行
print(grouped_mean.unstack())
df1['key1'] # 获取出来的数据是series数据
# groupby分组键可以是series还可以是数组
states = np.array(['Oh', 'Ca', 'Ca', 'Oh', 'Oh'])
years = np.array([2005, 2005, 2006, 2005, 2006])
print(df1['data1'].groupby([states, years]).mean())
# 直接将列名进行分组,非数据项不在其中,非数据项会自动排除分组
print(df1.groupby('key1').mean())
# 将入key2分组
print(df1.groupby(['key1', 'key2']).mean())
# size()方法,返回含有分组大小的Series,得到分组的数量
print(df1.groupby(['key1', 'key2']).size())
'''对分组信息进行迭代'''
# 将a,b进行分组
for name, group in df1.groupby('key1'):
print(name)
print(group)
# 根据多个建进行分组
for (k1, k2), group in df1.groupby(['key1', 'key2']):
print(name)
print(group)
'''选取一个或一组列,返回的Series的分组对象'''
# 对于groupBy对象,如果用一个或一组列名进行索引。就会聚合
print(df1.groupby(df1['key1'])['data1']) # 根据key1分组,生成data1的数据
print(df1.groupby(['key1'])[['data1', 'data2']].mean()) # 根据key1分组,生成data1,data2的数据
print(df1.groupby(['key1', 'key2'])['data1'].mean())
'''
根据索引级别分组
'''
columns = pd.MultiIndex.from_arrays([['US', "US", 'US', 'JP', 'JP'], [1, 3, 5, 1, 3]],
names=['cty', 'tenor'])
hier_df = pd.DataFrame(np.random.randn(4, 5), columns=columns)
print(hier_df)
# 根据级别分组
print(hier_df.groupby(level='cty', axis=1).count())