公众号:uncle39py

V1

2022/01/19阅读:68主题:默认主题

Pandas第三篇

Pandas第一篇讲解了其主线功能:读取数据、数据整体概览、提取目标数据、异常值处理。

Pandas第二篇对零散的知识点做了罗列。

此篇是Pandas的第三篇,继续写主线上的内容:数据分析(数据透视表、分组、多张表合并)、数据导出。

一、第二篇的补充

df['male'].apply(lambda x:x.title())
#按列(也可以对整个df),把每一个值都应用参数中的方法来处理,比如首字母大写等等。常与匿名函数联用,也可以用自己定义的函数。

df['amt'].str.replace('$','¥')
#replace替换功能也很常用,比如¥符号替换成$符号。

对于一张平铺直述的表格,无论的数据透视表还是分组,前提是要对行列字段有层次感(来源于现实世界和业务背景),层次感优先于技能。

二、数据透视表
df.pivot_table(
    values=None,  #对比excel,拉入"值"的变量
    index=None,   #对比excel,拉入"行"的变量
    columns=None#对比excel,拉入"列"的变量
    aggfunc='mean'#指定用什么样的统计函数:求和、均值等...
    fill_value=None,#缺失值的填充
    margins=False,  #是否需要行和列的总计值
    dropna=True,    #删除缺失值所在的行
    margins_name='All'#行、列总计字段的名称
    observed=False,
    sort=True,
) -> 'DataFrame'

df=pd.DataFrame({'学历':['初中','大学','初中','高中','高中','初中','大学'],
                '性别':['男','女','男','男','男','女','女'],
                '成绩':[32,43,23,43,35,43,23],
                '对产品的评分':[3,6,7,4,2,6,7]})
df.pivot_table(values='成绩',index='学历',columns='性别',aggfunc='sum',fill_value='无',margins=True)
三、分组
#对单一列进行分组,沿用上一个df的例子
df.groupby(['学历']).groups
#返回所有的组
#{'初中': [0, 2, 5], '大学': [1, 6], '高中': [3, 4]}

df.groupby(['学历']).size()
#获取按学历分组后,每个分组的大小(记录数)

df.groupby(['学历']).get_group('大学')
#返回"大学"这个组的数据
#学历 性别 成绩 对产品的评分
#1 大学 女 43 6
#6 大学 女 23 7
#对多列进行分组,首先要能感知到多列分组所代表的现实含义(层次感)
df.groupby(['学历','性别']).groups
#{('初中', '女'): [5], ('初中', '男'): [0, 2], ('大学', '女'): [1, 6], ('高中', '男'): [3, 4]}

df.groupby(['学历','性别']).get_group(('初中''男'))
#学历 性别 成绩 对产品的评分
#0 初中 男 32 3
#2 初中 男 23 7
df.groupby(['学历','性别']).size()

以上,用groupby函数进行分组时有一个参数:sort=True(默认值),代表排序,如果数据量比较大,把sort改成False可以提高速度。

分组不是目的,分组只是观察数据的一个维度。分组之后用聚合函数来统计出数据的值(平均值、最大值、最小值、总和等)

df.groupby(['学历']).agg(np.mean)
#agg代表聚合函数,可以写出aggregate
#        成绩 对产品的评分
#学历  
#初中 32.666667 5.333333
#大学 33.000000 6.500000
#高中 39.000000 3.000000
#初中成绩平均值32,大学成绩平均值33,高中成绩平均值39...
#这里数据这么看:1看行和列代表的含义,2看数值代表的含义(整个组的平均值)。


#换汤不换药的几种变形:
df.groupby(['学历','性别']).agg('sum')
df.groupby(['学历','性别'],as_index=False).agg('sum')
#as_index是否作为索引,默认为True
df.groupby(['学历','性别'],as_index=False).agg(['sum','mean'])
#聚合函数可以一次指定多个。原理一样,只是展示方式不同。
df.groupby(['学历','性别'],as_index=False)['成绩'].agg(['sum','mean'])
df.groupby(['学历','性别'],as_index=False).agg({'成绩':'sum','对产品的评分':'mean'})
数据要这么看:1看行和列代表的含义,2看数值代表的含义(平均、总和等)
四、多张表的合并
#两个数据集
df1=pd.DataFrame({'name':['王朝','马汉','张龙']
                 ,'age':[11,23,45]
                 ,'gender':['男','女','男']})
df2=pd.DataFrame({'name':['老王','老牛']
                 ,'age':[16,20]
                 ,'gender':['男','女']})
df3=pd.concat([df1,df2],ignore_index=True#ignore_index代表重排索引

pd.merge()两张表的拼接,类似与数据库中的left joinright join

五、数据导出
df3.to_csv('ccc.csv',index=False,encoding='utf-8')
df3.to_excel('ddd.xlsx',index=False,sheet_name='哈哈哈', encoding='utf-8')

分类:

人工智能

标签:

人工智能

作者介绍

公众号:uncle39py
V1