pandas统计分析(下)——数据格式化、分组统计

pandas统计分析(下)——数据格式化、分组统计,第1张

数据格式化

在数据处理以后需要对数据进行格式化,以增加数据的可读性。

设置小数位数

主要使用round函数实现四舍五入,decimals参数用于设置保留小数的位数。

round(decimals=0, *args, **kwargs)
  • decimals:每一列四舍五入的小数位数,整型、字典或Series对象。如果是整数,则将每一列四舍五入到相同的位置。否则,将字典和Series舍入到可变数目的位置;小数是类似于字典的,那么列名应该在键中;如果小数是级数,列名应该在索引中。没有包含在小数中的任何列都将保持原样。非输入列的小数元素将被忽略。
  • *args:附加的关键字参数
  • **kwargs:附加的关键字参数
  • 返回值:返回DataFrame对象。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random([5,5]),
                 columns = ['A1','A2','A3','A4','A5'])
print(df.round(2))#保留小数点后两位
#A1列保留小数点后一位,A2列保留两位
print(df.round({'A1':1,'A2':2}))
s1 =pd.Series([1,0,2],index = ['A1','A2','A3'])
#设置Series对象小数位数
print(df.round(s1))
   A1    A2    A3    A4    A5
0  0.85  0.95  0.39  0.18  0.09
1  0.75  0.06  0.89  0.61  0.77
2  0.55  0.19  0.90  0.16  0.91
3  0.95  0.87  0.44  0.30  0.14
4  0.82  0.82  0.61  0.58  0.80
    A1    A2        A3        A4        A5
0  0.8  0.95  0.386624  0.177894  0.085553
1  0.7  0.06  0.891726  0.607675  0.767936
2  0.5  0.19  0.904267  0.156154  0.910458
3  0.9  0.87  0.437880  0.295522  0.138203
4  0.8  0.82  0.614968  0.579653  0.802364
    A1   A2    A3        A4        A5
0  0.8  1.0  0.39  0.177894  0.085553
1  0.7  0.0  0.89  0.607675  0.767936
2  0.5  0.0  0.90  0.156154  0.910458
3  0.9  1.0  0.44  0.295522  0.138203
4  0.8  1.0  0.61  0.579653  0.802364
#保留小数位也可以用自定义函数
df.applymap(lambda x:'%.2f'%x)

notice:经过自定义函数处理过的数据不再是浮点型,而是对象型,后续计算需要数据,则应先进行类型转换。

设置百分比

可以使用apply()函数和format函数设置百分比,将浮点型小数转换成待指定小数位数的百分比数据。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random([5,5]),
                 columns = ['A1','A2','A3','A4','A5'])
#整列保留0位小数
df['百分比']= df['A1'].apply(lambda x:format(x,'.0%'))
print(df)
#整列保留两位小数
df['百分比'] = df['A1'].apply(lambda x:format(x,'.2%'))
print(df)
#使用map函数整列保留0位小数
df['百分比'] = df['A1'].map(lambda x:'{:.0%}'.format(x))
print(df)
        A1        A2        A3        A4        A5  百分比
0  0.757924  0.554116  0.289314  0.405738  0.971056  76%
1  0.381371  0.231832  0.960639  0.567997  0.957563  38%
2  0.533128  0.041719  0.780189  0.904583  0.803020  53%
3  0.590224  0.514953  0.322249  0.720569  0.839565  59%
4  0.400369  0.928340  0.116352  0.329837  0.894554  40%
         A1        A2        A3        A4        A5     百分比
0  0.757924  0.554116  0.289314  0.405738  0.971056  75.79%
1  0.381371  0.231832  0.960639  0.567997  0.957563  38.14%
2  0.533128  0.041719  0.780189  0.904583  0.803020  53.31%
3  0.590224  0.514953  0.322249  0.720569  0.839565  59.02%
4  0.400369  0.928340  0.116352  0.329837  0.894554  40.04%
         A1        A2        A3        A4        A5  百分比
0  0.757924  0.554116  0.289314  0.405738  0.971056  76%
1  0.381371  0.231832  0.960639  0.567997  0.957563  38%
2  0.533128  0.041719  0.780189  0.904583  0.803020  53%
3  0.590224  0.514953  0.322249  0.720569  0.839565  59%
4  0.400369  0.928340  0.116352  0.329837  0.894554  40%
设置千分位分隔符

有时需要将数据格式化为带千分位分隔符的数据,处理后的数据不再是浮点型,而是对象型。

import pandas as pd
data = [['a','1',4564789456],['b','2',6879451365]]
df = pd.DataFrame(data = data)
df[2] = df[2].apply(lambda x:format(int(x),','))
print(df)
   0  1              2
0  a  1  4,564,789,456
1  b  2  6,879,451,365
数据分组统计

主要使用groupby进行分组

分组统计groupby函数

对数据进行分组统计,主要是用DataFrame中的groupby函数,主要功能为:

  • 根据给定的条件将数据拆分成组
  • 每个组都可以独立应用函数(如sum、mean等)
  • 将结果合并到一个数据结构中。

groupby函数用于将数据按照一列或多列进行分组,一般与计算函数结合使用,从而对数据进行分组。

groupby(by=None, axis=0, level=None, as_index: 'bool' = True, sort: 'bool' = True, group_keys: 'bool' = True, squeeze: 'bool' = , observed: 'bool' = False, dropna: 'bool' = True)
 

参数说明:

  • by:映射、字典或Series对象、数组、标签或标签列表。如果by是函数,则对象索引的每个值 都调用这个函数;如果是字典或Series对象,则使用该字典或seri对象值进行分组;如果是ndarray,则按原样使用这些值来确定组。
  • axis:axis = 1表示行,axis = 0表示列,默认为0.
  • level:表示索引层级,默认为None
  • as_index:布尔型,默认为True,返回以组标签为索引的对象
  • sort:对组进行排序,布尔型,默认是True
  • group_keys:布尔型,默认值为True,调用apply函数时,将分组的键添加到索引以标识片段
  • squeeze:布尔型,默认值为false。如果可能,减少返回类型的维度,否则返回一致类型。
  • 返回值:返回DataFramegroupby,返回包含有关组的信息的groupby对象。
按照一列分组统计
import pandas as pd
df = pd.read_csv('MR/Code/04/15/JD.csv',encoding= 'gbk')
#抽取数据
df1 = df[['一级分类','7天点击量','订单预定']]
#分组统计求和
df1.groupby('一级分类').sum()
7天点击量订单预定
一级分类
数据库18615
移动开发2617
编程语言与程序设计4280192
网页制作/Web技术34515
按照多列分组统计
import pandas as pd
df = pd.read_csv('MR/Code/04/15/JD.csv',encoding= 'gbk')
#抽取数据
df1 = df[['一级分类','二级分类','7天点击量','订单预定']]

#分组统计求和
df1.groupby(['一级分类','二级分类']).sum()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1WuFFfr-1650631191621)(C:\Users\85289\AppData\Roaming\Typora\typora-user-images\image-20220419174638908.png)]

分组并按指定列进行数据计算
import pandas as pd
df = pd.read_csv('MR/Code/04/15/JD.csv',encoding= 'gbk')
#抽取数据
df1 = df[['一级分类','二级分类','7天点击量','订单预定']]

#分组统计求和
df1.groupby('二级分类')['7天点击量'].sum()
二级分类
ASP.NET           87
Android          261
C#               314
C++/C语言          724
HTML             188
JSP/JavaWeb      157
Java             408
JavaScript       100
Oracle            58
PHP              113
Python          2449
SQL              128
Visual Basic      28
WEB前端             57
Name: 7天点击量, dtype: int64
对分组数据进行迭代

通过for循环对分组统计数据进行迭代(遍历分组数据)

#抽取数据
df = pd.read_csv('MR/Code/04/15/JD.csv',encoding= 'gbk')
df1 = df[['一级分类','7天点击量','订单预定']]
for name,group in df1.groupby('一级分类'):
    print(name)
    print(group)
数据库
   一级分类  7天点击量  订单预定
25  数据库     58     2
27  数据库    128    13
移动开发
    一级分类  7天点击量  订单预定
10  移动开发     85     4
19  移动开发     32     1
24  移动开发     85     2
28  移动开发     59     0
编程语言与程序设计
         一级分类  7天点击量  订单预定
0   编程语言与程序设计     35     1
1   编程语言与程序设计     49     0
2   编程语言与程序设计     51     2
3   编程语言与程序设计     64     1
4   编程语言与程序设计     26     0
5   编程语言与程序设计     60     1
6   编程语言与程序设计    227    11
8   编程语言与程序设计    122     3
9   编程语言与程序设计    111     5
11  编程语言与程序设计    165     5
12  编程语言与程序设计    131     1
13  编程语言与程序设计    149    10
15  编程语言与程序设计   1139    79
16  编程语言与程序设计    125     1
18  编程语言与程序设计    149     4
20  编程语言与程序设计     52     1
21  编程语言与程序设计    597    25
22  编程语言与程序设计    474    15
23  编程语言与程序设计     83     3
26  编程语言与程序设计    132     8
29  编程语言与程序设计     27     2
30  编程语言与程序设计    239    13
31  编程语言与程序设计     45     1
32  编程语言与程序设计     28     0
网页制作/Web技术
          一级分类  7天点击量  订单预定
7   网页制作/Web技术    100     7
14  网页制作/Web技术    188     8
17  网页制作/Web技术     57     0

notice:name是groupby函数中’一级分类‘的值,group是分组后的数据。如果groupby函数对多列进行分组,那么需要在for循环中指定多列。

迭代两级分类的订单数据
#抽取数据
df = pd.read_csv('MR/Code/04/15/JD.csv',encoding= 'gbk')
df2 = df[['一级分类','二级分类','7天点击量','订单预定']]
for (key1,key2),group in df2.groupby(['一级分类','二级分类']):
    print(key1,key2)
    print(group)
数据库 Oracle
   一级分类    二级分类  7天点击量  订单预定
25  数据库  Oracle     58     2
数据库 SQL
   一级分类 二级分类  7天点击量  订单预定
27  数据库  SQL    128    13
移动开发 Android
    一级分类     二级分类  7天点击量  订单预定
10  移动开发  Android     85     4
19  移动开发  Android     32     1
24  移动开发  Android     85     2
28  移动开发  Android     59     0
编程语言与程序设计 ASP.NET
         一级分类     二级分类  7天点击量  订单预定
0   编程语言与程序设计  ASP.NET     35     1
20  编程语言与程序设计  ASP.NET     52     1
编程语言与程序设计 C#
         一级分类 二级分类  7天点击量  订单预定
5   编程语言与程序设计   C#     60     1
8   编程语言与程序设计   C#    122     3
26  编程语言与程序设计   C#    132     8
编程语言与程序设计 C++/C语言
         一级分类     二级分类  7天点击量  订单预定
6   编程语言与程序设计  C++/C语言    227    11
9   编程语言与程序设计  C++/C语言    111     5
11  编程语言与程序设计  C++/C语言    165     5
18  编程语言与程序设计  C++/C语言    149     4
29  编程语言与程序设计  C++/C语言     27     2
31  编程语言与程序设计  C++/C语言     45     1
编程语言与程序设计 JSP/JavaWeb
         一级分类         二级分类  7天点击量  订单预定
4   编程语言与程序设计  JSP/JavaWeb     26     0
12  编程语言与程序设计  JSP/JavaWeb    131     1
编程语言与程序设计 Java
         一级分类  二级分类  7天点击量  订单预定
2   编程语言与程序设计  Java     51     2
13  编程语言与程序设计  Java    149    10
16  编程语言与程序设计  Java    125     1
23  编程语言与程序设计  Java     83     3
编程语言与程序设计 PHP
        一级分类 二级分类  7天点击量  订单预定
1  编程语言与程序设计  PHP     49     0
3  编程语言与程序设计  PHP     64     1
编程语言与程序设计 Python
         一级分类    二级分类  7天点击量  订单预定
15  编程语言与程序设计  Python   1139    79
21  编程语言与程序设计  Python    597    25
22  编程语言与程序设计  Python    474    15
30  编程语言与程序设计  Python    239    13
编程语言与程序设计 Visual Basic
         一级分类          二级分类  7天点击量  订单预定
32  编程语言与程序设计  Visual Basic     28     0
网页制作/Web技术 HTML
          一级分类  二级分类  7天点击量  订单预定
14  网页制作/Web技术  HTML    188     8
网页制作/Web技术 JavaScript
         一级分类        二级分类  7天点击量  订单预定
7  网页制作/Web技术  JavaScript    100     7
网页制作/Web技术 WEB前端
          一级分类   二级分类  7天点击量  订单预定
17  网页制作/Web技术  WEB前端     57     0
对分组的某列或多列使用聚合函数(agg函数)

python也可以实现像sql中的分组聚合运算 *** 作,主要通过groupby函数和agg函数。

print(df1.groupby('一级分类').agg(['mean','sum']))
                 7天点击量        订单预定     
                  mean   sum  mean  sum
一级分类                                   
数据库          93.000000   186  7.50   15
移动开发         65.250000   261  1.75    7
编程语言与程序设计   178.333333  4280  8.00  192
网页制作/Web技术  115.000000   345  5.00   15
针对不同的列使用不同聚合函数
print(df1.groupby('一级分类').agg({'7天点击量':['mean','sum'],
                               '订单预定':['sum']}))
                 7天点击量       订单预定
                  mean   sum  sum
一级分类                             
数据库          93.000000   186   15
移动开发         65.250000   261    7
编程语言与程序设计   178.333333  4280  192
网页制作/Web技术  115.000000   345   15
通过自定义函数来分组统计
df = pd.read_excel('MR/Code/04/22/1月.xlsx')#导入excel文件
#x是“宝贝标题 ”对应的列
#value_count()函数用于Series对象中的每个值进行计数并且排序
pd.set_option('display.unicode.east_asian_width',True)
max1 = lambda x:x.value_counts(dropna = False).index[0]
df1 = df.agg({'宝贝标题':[max1],
             '数量':['sum','mean'],
             '买家实际支付金额':['sum','mean']})
print(df1)
                宝贝标题   数量  买家实际支付金额
  零基础学Python    NaN               NaN
sum                  NaN  53.00         2528.5600
mean                 NaN   1.06           50.5712
可以通过设置max1.__name__ = '购买次数最多'解决
通过字典和Series对象进行分组统计

通过字典简历对应关系,然后将字典传递给groupby函数即可实现数据分组统计

df = pd.read_csv('MR/Code/04/23/JD.csv',encoding='gbk')
df = df.set_index(['商品名称'])
dict1 = {'北京出库销量':'北上广','上海出库销量':'北上广',
        '广州出库销量':'北上广','成都出库销量':'成都',
        '武汉出库销量':'武汉','西安出库销量':'西安'}
df1 = df.groupby(dict1,axis = 1).sum()
print(df1)

                                  北上广  成都  武汉  西安
商品名称                                                  
零基础学Python(全彩版)            1991   284   246   152
Python从入门到项目实践(全彩版)     798   113    92    63
Python项目开发案例集锦(全彩版)     640   115    88    57
Python编程锦囊(全彩版)             457    85    65    47
零基础学C语言(全彩版)              364    82    63    40
SQL即查即用(全彩版)                305    29    25    40
零基础学Java(全彩版)               238    48    43    29
零基础学C++(全彩版)                223    53    35    23
零基础学C#(全彩版)                 146    27    16     7
C#项目开发实战入门(全彩版)         135    18    22    12

通过Series对象进行分组统计与字典方法类似。

data = {'北京出库销量':'北上广','上海出库销量':'北上广',
        '广州出库销量':'北上广','成都出库销量':'成都',
        '武汉出库销量':'武汉','西安出库销量':'西安'}
s1 = pd.Series(data)
print(s1)
df1 = df.groupby(s1,axis=1).sum()
print(df1)
北京出库销量    北上广
上海出库销量    北上广
广州出库销量    北上广
成都出库销量      成都
武汉出库销量      武汉
西安出库销量      西安
dtype: object
                                  北上广  成都  武汉  西安
商品名称                                                  
零基础学Python(全彩版)            1991   284   246   152
Python从入门到项目实践(全彩版)     798   113    92    63
Python项目开发案例集锦(全彩版)     640   115    88    57
Python编程锦囊(全彩版)             457    85    65    47
零基础学C语言(全彩版)              364    82    63    40
SQL即查即用(全彩版)                305    29    25    40
零基础学Java(全彩版)               238    48    43    29
零基础学C++(全彩版)                223    53    35    23
零基础学C#(全彩版)                 146    27    16     7
C#项目开发实战入门(全彩版)         135    18    22    12

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/736969.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)