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