笔者最近正在学习Pandas数据分析,将自己的学习笔记做成一套系列文章。本节主要记录Pandas中groupby的使用(类似sql数据库中的groupby)
类似SQL:
select city,max(temperature) from city_weather group by city;
group:先对数据分组,然后再在每个分组上应用聚合函数、转换函数
本次演示:
import pandas as pd
import numpy as np
#加上这句,就可以在jupyter notebook展示matplot图表
%matplotlib inline
df=pd.DataFrame(
{'A':['foo','bar','foo','bar','foo','bar','foo','foo'],
'B':['one','one','two','three','two','two','one','three'],
'C':np.random.randn(8),
'D':np.random.randn(8)
}
)
df
#1. 单个列groupby,查询所有数据列的统计
#我们容易看到:
#groupby中的'A'变成了数据的索引列
#因为要统计sum,但是B列不是数字,所以要被自动忽略掉
df.groupby('A').sum()
#2. 多个列groupby,查询所有数据列的统计
# 我们容易看到: ('A','B')成对变成了二级索引
df.groupby(['A','B']).mean()
df.groupby(['A','B'],as_index=False).mean()
#3.同时查看多种统计数据
#我们看到列就成为了多级的索引
df.groupby('A').agg([np.sum,np.mean,np.std])
#4.查看单列的结果数据统计
#方法1:预过滤,性能更好
df.groupby('A')['C'].agg([np.sum,np.mean,np.std])
#方法2
df.groupby('A').agg([np.sum,np.mean,np.std])['C']
#5.不同列使用不同的聚合函数
df.groupby('A').agg({'C':np.sum,'D':np.mean})
#for循环可以直接遍历每个group
#1.遍历单个列聚合的分组
g=df.groupby('A')
g
for name,group in g:
print(name)
print(group)
print()
#可以获得单个分组的数据
g.get_group('bar')
#2.遍历多个列聚合的分组
g=df.groupby(['A','B'])
for name,group in g:
print(name)
print(group)
print()
#可以看到name是一个2个元素的tuple,代表不同的列
g.get_group(('foo','one'))
#可以直接查询group后的某几列,生成Series或者子DataFrame
g['C']
for name,group in g['C']:
print(name)
print(group)
print(type(group))
print()
#其实所有的聚合统计,都是在dataframe和series上进行的
import pandas as pd
fpath="./datas/600033.csv"
df=pd.read_csv(fpath)
df.head()
#新增一列为vol的后两位
df['new']=df['vol']*100%100
df.head()
#查看每个同分组的最高温度
data=df.groupby('new')['open'].max()
data
type(data)
data.plot()
#查看每个分组开盘价的最高,收盘的最低,成交量的平均
df.head()
group_data=df.groupby('new').agg({'open': np.max,'close':np.min,'amount':np.mean})
group_data
group_data.plot()
这就是pandas的groupby基本用法了,希望可以帮助到你。