博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Pandas 第三部分
阅读量:4562 次
发布时间:2019-06-08

本文共 7289 字,大约阅读时间需要 24 分钟。

 

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             pass100         101         #取消 层次化索引  102         # df = df.reset_index()103         pass104 105     #2,数据旋转106     if 1:107         data = df[:5]108         print(data)  #下面就是单纯只操作这个data109 110         #行列转换 转置111         if  0:112             ret = data.T113             print(ret)114             pass115 116         #dataframe  可以使用stack 和  unstack  转化为层次化的Series117         if 0:118             ret = data.stack()  #转为了  层次化的Series119             print(ret)120             pass121         pass122     pass123 #数据分组 ,分组运算124 if 0:125     #主要用的是groupby 计数:先分组,然后再进行聚合运算   类似于数据透视表126             #需要注意的是  groupby 只会数值变量进行分组运算127 128     #按照 学号分组129     group = df.groupby(df['学号'])130 131     #查看group132     if 0:133         print(group)134         print(type(group))135         pass136     if 0:137         #可以计算分组后的各个统计量138         ret = group.mean()139         print(ret)140 141         pass142 143     if 0:144         #计算每个姓名 的平均工资145         group = df['工资'].groupby(df['姓名'])146         ret = group.mean()147         print(ret)148         pass149 150     if 0:151         # 根据多个分组变量进行分组152         group = df.groupby(['学号','姓名'])153         ret = group.mean()154         print(ret)155         pass156     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 转为 dataframe165             ret = ret.unstack()166             print(ret)167             #需要注意的是 ,这会产生一些缺失值  NaN168             pass169         pass170 171     pass172 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-99185     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: category193         # Categories(4, interval[int64]): [(0, 18] < (18, 30] < (30, 50] < (50, 99]]194         pass195 196     if 0:197         #给各组加标签198         ret = pd.cut(df['年龄'], [0, 18, 30, 50, 99],labels=['少年','青年','中年','老年'])199         print(ret)200         pass201 202     if 0:203         #给各个分组加标签  并新增到 pd 中204         df['年龄等级'] = pd.cut(df['年龄'], [0, 18, 30, 50, 99],labels=['少年','青年','中年','老年'])205         print(df)206         pass207 208     if 0:209         #设置年龄的分位数210         bins = np.percentile(df['年龄'],[0,20,50,100])211         print(bins)  #[18. 26. 40. 98.]  #最小的是18 岁, 最大的98 岁212 213         pass214 215 216     pass217 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         pass231     #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         pass270 271     #3,concat272     #将多个数据集进行批量合并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         pass282     pass
View Code

 

转载于:https://www.cnblogs.com/zach0812/p/11566681.html

你可能感兴趣的文章
阿里云SDK手册之java SDK
查看>>
js获取select标签选中的值[转]
查看>>
mysql连接出现error node【1045】
查看>>
踩vue的bug
查看>>
Ansible安装及配置
查看>>
浅析Sql Server参数化查询
查看>>
CodeBlocks 配置
查看>>
机器学习:随机森林
查看>>
[网络流24题] 试题库问题
查看>>
面试分享:应届前端面试经历
查看>>
Essentially No Barriers in Neural Network Energy Landscape
查看>>
A pure L1-norm principal component analysis
查看>>
SVM
查看>>
Dimension reduction in principal component analysis for trees
查看>>
Deep Linear Networks with Arbitrary Loss: All Local Minima Are Global
查看>>
golang开发:类库篇(五)go测试工具goconvey的使用
查看>>
浅谈限流(下)实战
查看>>
jpa(Java Persistence API)
查看>>
spring之雜談
查看>>
vue修改启动的端口和host
查看>>