• Pandas 第三部分


      1 import numpy as np
      2 import pandas as pd
      3 
      4 df = pd.read_excel("d:/test.xlsx")
      5 #数据重塑和轴向旋转
      6 if 0:
      7     #1,层次化索引
      8     if 0:
      9         #层次化索引是pandas 的一项重要功能,它能使我们在一个轴上拥有多个索引
     10 
     11         #Series 的层次化索引
     12         if 0:
     13             s = pd.Series(np.arange(1,10),index=[['a','a','a','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,3]])
     14             print(s)
     15             if 0:
     16                 print(s.index)
     17                 pass
     18             if 0:
     19                 #对外层索引进行操作
     20                 print(s['a'])
     21                 print(s['a':'b'])
     22             if 0:
     23                 #对内层索引进行操作
     24                 print(s[:,1])
     25 
     26                 #索引具体的值
     27                 print(s['a',1])
     28                 pass
     29 
     30             if 0:
     31                 #通过unstack 方法可以将Series 变成 DataFrame
     32                 ret = s.unstack()
     33                 print(ret)    #这时外层索引就成了行标签  ,内层索引就成了列标签
     34                 if 0:
     35                     ret = s.unstack().stack()
     36                     print(ret)  #可以使用 stack ()  将DataFrame 转回
     37                 pass
     38 
     39 
     40 
     41 
     42             pass
     43 
     44 
     45         #DataFrame 的层次化索引
     46         if 0:
     47             #对于 DataFrame 来说,行和列都是可以进行层次化索引的
     48             data  = pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]],columns=[['A','A','B' ],[1,2,3]])
     49             print(data) #这时就是需要四个索引才能确定一个数字了 ,这就将二维数据变成了四维数据   。
     50 
     51             if 0:
     52                 #索引列
     53                 print(data['A'])
     54                 pass
     55             if 0:
     56                 #给索引设置名称
     57                 data.index.names =['row1','row2']
     58                 data.columns.names = ['col1','col2']
     59                 print(data)
     60                 if 0:
     61                     #然后 使用swaplevel 对row1 和  row2 调换
     62                     ret  = data.swaplevel('row1','row2')
     63                     print(ret)
     64                     pass
     65 
     66                 pass
     67 
     68 
     69             pass
     70 
     71         #操作df 数据集
     72         if 1:
     73             if 0:
     74                 ret = df.index
     75                 print(ret)
     76                 # print(df.dtypes)
     77                 pass
     78             if 1:
     79                 #把学号设置成外索引,姓名设置为内索引
     80                 ret = df.set_index(['学号','姓名'])
     81                 print(ret)
     82                 #此时的每个索引都是个索引
     83                 if 0:
     84                     print(ret.index[0])  #(17096218, '张三')
     85 
     86                     pass
     87 
     88                 #获取17096218 学号的
     89                 if 0:
     90                     ret = ret.loc[17096218]
     91                     print(ret)  #此时姓名就成了外索引
     92                     
     93                     pass
     94 
     95 
     96                 pass
     97 
     98 
     99             pass
    100         
    101         #取消 层次化索引  
    102         # df = df.reset_index()
    103         pass
    104 
    105     #2,数据旋转
    106     if 1:
    107         data = df[:5]
    108         print(data)  #下面就是单纯只操作这个data
    109 
    110         #行列转换 转置
    111         if  0:
    112             ret = data.T
    113             print(ret)
    114             pass
    115 
    116         #dataframe  可以使用stack 和  unstack  转化为层次化的Series
    117         if 0:
    118             ret = data.stack()  #转为了  层次化的Series
    119             print(ret)
    120             pass
    121         pass
    122     pass
    123 #数据分组 ,分组运算
    124 if 0:
    125     #主要用的是groupby 计数:先分组,然后再进行聚合运算   类似于数据透视表
    126             #需要注意的是  groupby 只会数值变量进行分组运算
    127 
    128     #按照 学号分组
    129     group = df.groupby(df['学号'])
    130 
    131     #查看group
    132     if 0:
    133         print(group)
    134         print(type(group))
    135         pass
    136     if 0:
    137         #可以计算分组后的各个统计量
    138         ret = group.mean()
    139         print(ret)
    140 
    141         pass
    142 
    143     if 0:
    144         #计算每个姓名 的平均工资
    145         group = df['工资'].groupby(df['姓名'])
    146         ret = group.mean()
    147         print(ret)
    148         pass
    149 
    150     if 0:
    151         # 根据多个分组变量进行分组
    152         group = df.groupby(['学号','姓名'])
    153         ret = group.mean()
    154         print(ret)
    155         pass
    156     if 0:
    157         #获取每个学号,每个姓名的 工资的均值
    158         group = df['工资'].groupby([df['学号'],df['姓名']])
    159         # group = df['工资'].groupby(['学号','姓名'])  #错误
    160         print(group.mean())
    161 
    162         ret = group.mean()
    163         if 0:
    164             #现在通过  unstack  将ret 转为 dataframe
    165             ret = ret.unstack()
    166             print(ret)
    167             #需要注意的是 ,这会产生一些缺失值  NaN
    168             pass
    169         pass
    170 
    171     pass
    172 
    173 #离散化处理
    174 if  0:
    175     #pandas 为我们提供了 方便的函数 cut();
    176     #pd.cut(x,bins,right=True,labels=None,retbins= False,precision=3,include_lowest=False)
    177     #参数解释
    178     #x:需要离散化的数组  , Series DataFrame 对象
    179     #bins :分组的依据  一般是个数字/或序列    数字指的的是分成几组
    180     #right :是否包含右端点
    181     #inlcude_lowest  :是否包含左端点
    182     #labels  可以指定分组的 名称
    183 
    184     #下面对年龄进行分组  0-18  18-30  30-50 50-99
    185     if 0:
    186         ret = pd.cut(df['年龄'], [0, 18, 30, 50, 99])  # 这时的bins 是个列表
    187         print(ret)
    188         # 316(0, 18]
    189         # 317(18, 30]
    190         # 318(18, 30]
    191         # 319(18, 30]
    192         # Name: 年龄, Length: 320, dtype: category
    193         # Categories(4, interval[int64]): [(0, 18] < (18, 30] < (30, 50] < (50, 99]]
    194         pass
    195 
    196     if 0:
    197         #给各组加标签
    198         ret = pd.cut(df['年龄'], [0, 18, 30, 50, 99],labels=['少年','青年','中年','老年'])
    199         print(ret)
    200         pass
    201 
    202     if 0:
    203         #给各个分组加标签  并新增到 pd 中
    204         df['年龄等级'] = pd.cut(df['年龄'], [0, 18, 30, 50, 99],labels=['少年','青年','中年','老年'])
    205         print(df)
    206         pass
    207 
    208     if 0:
    209         #设置年龄的分位数
    210         bins = np.percentile(df['年龄'],[0,20,50,100])
    211         print(bins)  #[18. 26. 40. 98.]  #最小的是18 岁, 最大的98 岁
    212 
    213         pass
    214 
    215 
    216     pass
    217 
    218 #合并数据集
    219 
    220 if 0:
    221     #1,append  拼接时,尽量数据都是相同的
    222         #它使用的不是很多,除非是一个excel 放不下,多个excel 文件,然后到python中合并
    223     if 0:
    224         df_zcb = df[df['姓名']== '张昌博']
    225         df_zs = df[df['姓名'] == '张三']
    226         ret = df_zcb.append(df_zs)
    227         print(ret)
    228 
    229 
    230         pass
    231     #2,merge  (用的比较多 )  做横向的拼接
    232     # df.merge(
    233     #         left,  左边的数据文件
    234     #         right,  右边的数据文件
    235     #         how="inner",  拼接的方式  ,默认是内连接
    236     #         on=None,   按照 那一列连接  (左右都有的)
    237     #         left_on=None,  如果不是左右都有
    238     #         right_on=None,
    239     #         left_index=False,
    240     #         right_index=False,
    241     #         sort=False,
    242     #         suffixes=("_x", "_y"),
    243     #         copy=True,
    244     #         indicator=False,
    245     #         validate=None,
    246     # )
    247     if 0:
    248         df1 = df[:5]
    249         print(df1)
    250         df2 = df[:5]
    251         df2['工龄'] =[1,2,3,4,14]  #增加一列
    252         # print(df2)
    253 
    254         #将df2 打乱
    255         df2 = df2.sample(frac=1)
    256         # print(df2)
    257         df2.index = range(len(df2))  #将索引再次赋值
    258         print(df2)
    259 
    260         #现在将df1  和  df2 进行合并  按学号连接
    261         ret = pd.merge(df1,df2,how='inner',on = '学号')
    262         print(ret)
    263 
    264 
    265 
    266 
    267 
    268 
    269         pass
    270 
    271     #3,concat
    272     #将多个数据集进行批量合并
    273     if 0:
    274         df1 = df[:10]
    275         df2 = df[100:110]
    276         df3 = df[200:210]
    277 
    278         # ret = pd.concat(df1,df2,df3)  #错误
    279         ret = pd.concat([df1,df2,df3])
    280         print(ret)
    281         pass
    282     pass
    View Code
  • 相关阅读:
    JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
    JavaScript学习总结(二)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
    CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化
    CSS3与页面布局学习总结(七)——前端预处理技术(Less、Sass、CoffeeScript、TypeScript)
    CSS3与页面布局学习总结(六)——CSS3新特性(阴影、动画、渐变、变形、伪元素等)
    CSS3与页面布局学习总结(四)——页面布局大全
    CSS3与页面布局学习总结(五)——Web Font与Sprite
    CSS3与页面布局学习总结(三)——BFC、定位、浮动、7种垂直居中方法
    CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset
    HTML5 学习总结(四)——canvas绘图、WebGL、SVG
  • 原文地址:https://www.cnblogs.com/zach0812/p/11566681.html
Copyright © 2020-2023  润新知