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