返回顶部

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

 

posted @ 2019-09-22 11:05  Zcb0812  阅读(171)  评论(0编辑  收藏  举报