【Python数据分析学习笔记-9】数据分组和聚合-数据分组

数据分组

首先导入所需要的模块

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
import numpy as np
数据的读取
tips=sns.load_dataset('tips')
print(tips.head())

这个结果返回的是前五行数据。
head(n=5) 这个方法默认情况下是返回前五行数据,改变n,可以输出n行数据。
如n=10时输出:
在这里插入图片描述
读取过程中,也许会报错:
在这里插入图片描述
这个时候,我们可以检查源代码,点住load_dataset按ctrl加鼠标左键,发现原来这个数据是从网上读取的 。
在这里插入图片描述
通过找到这个网址进行下载:
不过,上面还有其他数据 ,把它们全部下载下来即可,是一个压缩包
在这里插入图片描述
不过,这里我有数据:
链接:https://pan.baidu.com/s/1NI9whg-fJ1CRyus2e25JxQ
提取码:obgz
下载下来即可:
也可以这样读取:

tips=pd.read_csv(open('./tips.csv'))
print(tips.head())

不过要把下载的文件放到同一个文件夹下面

group_1=tips['tip'].groupby(tips['sex'])
print(group_1) # group_1为GroupBy对象,是保存的中间数据,可以通过mean方法即可返回数据

在这里插入图片描述

data_mean=tips['tip'].groupby(tips['sex']).mean()  #返回的是一个Series数据
print(data_mean)
data_mean_1=tips['tip'].groupby([tips['day'],tips['time']]).mean()
print(data_mean_1)

在这里插入图片描述
为了使结果更加清晰,可以通过作图发现

data_mean_1.plot(kind='barh')
plt.show()

在这里插入图片描述
GroupBy对象是可以迭代的,其构造为一组二元元组

for i,j in tips.groupby(tips['sex']):
    print(i)
    print(j)

在这里插入图片描述
size方法可以返回各分组的大小

print(tips.groupby(tips['sex']).size())
print(tips.groupby(tips['time']).size())

在这里插入图片描述

按列名进行分组
print(tips.groupby('smoker').mean())
df_2=tips.groupby('smoker').mean()
df_2['total_bill'].plot(kind='bar')
plt.show()

在这里插入图片描述
在这里插入图片描述
tips是多列DataFrame的数据,如果只需要获取tip 列的数据,通过索引选取即可。但GroupBy对象也可以通过索引tip列,然后再进行聚合运算。

print(tips['tip'].groupby(tips['time']).mean())

print(tips.groupby('time')['tip'].mean())

在这里插入图片描述

按列表或元组分组
df_1=DataFrame(np.arange(8).reshape(4,2))
list_1=['-a','-b','-a','-b']
print(df_1)
print(df_1.groupby(list_1).sum())

在这里插入图片描述

按字典分组

如果原始的DataFrame中的分组信息很难确定或者不存在,可通过字典结构,定义分组信息。

df_3=DataFrame(np.arange(16).reshape(4,4),index=['-a','-b','-c','-d'])
print(df_3)
print(df_3.groupby(
    {'-a': '-a-c',
     '-b': '-b-d',
     '-c': '-a-c',
     '-d': '-b-d'
     }).sum())

在这里插入图片描述

按函数分组

函数作为分组键的原理类似于字典,通过映射关系进行分组,但是函数分组更加灵活。

df_4=DataFrame(np.random.randn(4,4))
def f(x):
    if x>0:
        return '正数'
    elif x==0:
        return '零'
    else:
        return '负数'
print(df_4)
print(df_4[2].groupby(df_4[2].map(f)).sum())

在这里插入图片描述
对于层次化索引,可以通过级别进行分组

df_5=DataFrame(np.arange(12).reshape(4,3),index=
               [['a','a','b','b'],['--a','--b','--a','--b']])
print(df_5)
print(df_5.groupby(level=0).sum())

在这里插入图片描述
也可在列上进行分组

df_6=DataFrame(np.arange(12).reshape(3,4),columns=
               [['a','a','b','b'],['--a','--b','--a','--b']])
print(df_6)
print(df_6.groupby(level=1,axis=1).sum())

在这里插入图片描述

发布了51 篇原创文章 · 获赞 299 · 访问量 9190

猜你喜欢

转载自blog.csdn.net/qq_45404396/article/details/104342046