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