【python数据分析】-数据分组和聚合数据分组聚合(一)-分组
python数据分析-数据分组聚合(一)-分组
又开始我的好好学习之旅,今天学习数据分析!
今天要学数据分组和聚合,分组统计在数据分析中运用的比较多,还有数据透视表也是数据分析必备的技能,今天来get一下~
1.数据源
数据源:Python第三方库seaborn(用于绘图)中自带的数据
import numpy as np
from pandas import Series,DataFrame
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
tips.head()
之前调用这个库都是好好的,今天出现了报错URLError: <urlopen error [Errno 60] Operation timed out>
大概知道是超时的问题,但是百度了半天没找到原因,有人知道一定要告诉我哇~
只好想别的办法解决这个问题啦~
遇到不会的习惯用??来查看下是不是用错方法了,然后发现这个数据集都在
https://github.com/mwaskom/seaborn-data
找到小费数据:
https://github.com/mwaskom/seaborn-data/blob/master/tips.csv
用pd.read_html获取数据
df = pd.read_html('https://github.com/mwaskom/seaborn-data/blob/master/tips.csv')
tips=df[0]
tips.head()
这个方法返回的是个列表,所以只要取tips[0],就说所需要的数据了
嘤嘤嘤,怎么多了一个“Unnamed: 0”,删掉!
tips = tips.drop('Unnamed: 0',axis=1)
tips.head()
搞定!拿到了数据!就是不知道为什么会报错很难受(╯﹏╰)
2.GroupBy
对源数据按照性别进行分组,发现返回的是一个对象,对该对象调用mean方法即可返回数据
grouped = tips['tip'].groupby(tips['sex'])
grouped.mean()
同样可以通过多个分组键进行分组聚合计算,比如通过day和time计算小费的平均值。
用plot绘制下,可以快速看出数据特点
之前通过tips.loc[tips['sex']=='Male','tip'].head()
tips.loc[tips['sex']=='Female','tip'].head()
可以分别查看数据情况
其实groupby对象是可迭代的,其构造为一组二元组,groupby由分组名和数据片构成
for name,group in tips.groupby(tips['sex']):
print(name)
print(group)
2.1GroupBy按照列名分组
之前的groupby的分组键是Series(tips[‘sex’]),其实groupby的分组键还能支持其他格式,如列索引的列名,但是列名必须是分组的对象的列名,不然会检索不到报错。
for name,group in tips.groupby(tips['sex']):
print(name)
print(group)
如果我们不需要这么多列df数据,只想要tip列,通过索引选取即可。但是groupby对象也可通过索引获取tip列,程序员小哥哥们叫他【语法糖】,好可爱的叫法。去查了下:
语法糖就是程序语言中提供[奇技淫巧]的一种手段和方式而已。 通过这类方式编写出来的代码,即好看又好用,好似糖一般的语法。固美其名曰:语法糖
2.2GroupBy按照列表或元组分组
分组键还可以是长度适当的列表和元组,长度是指与待分组的df的行数是一样的!其实就是把列表或者元组当做一列进行分组。
2.2GroupBy按照字典分组
df = DataFrame(np.random.normal(size=(6,6)),
index=['a','b','c','A','B','C'])
dic1 = {
'a':'one',
'A':'one',
'b':'two',
'B':'two',
'c':'three',
'C':'three'
}
df.groupby(dic1).sum()
2.2GroupBy按函数分组
其实按照函数分组就是按照列表或字典分组,只不过会更加灵活
df = DataFrame(np.random.randn(4,4))
def zf(x):
if x >= 0:
return 'a'
else:
return 'b'
df[1].map(zf)
df[1].groupby(df[1].map(zf)).sum()
层次化索引,可以直接写level=1来进行分组,还可以按照列进行索引
df = DataFrame(np.arange(16).reshape(4,4),
index=[['a','a','b','b'],['aa','bb','aa','bb']],
columns=[['one','one','two','two'],['oo','tt','oo','tt']])
df