1 import numpy as np
2 import pandas as pd
3
4 #Pandas 的基本数据结构
5 if 0:
6
7 # 两种
8 # Series
9 if 0:
10 #一维Series 可以用一维列表来初始化
11 if 0:
12 s = pd.Series([1,2,3,np.nan,4,5])
13 print(s)
14
15 s1 = pd.Series([1,2,3,np.nan,4,5],index=['a','b','c','d','e','f'])
16 print(s1)
17
18 #索引 - 数据的行标签
19 if 0:
20 s = pd.Series([1,2,3,np.nan,4,5])
21 print(s.index) #RangeIndex(start=0, stop=6, step=1)
22
23 #值
24 if 0:
25 s = pd.Series([1,2,3,np.nan,4,5])
26 print(s.values) #[ 1. 2. 3. nan 4. 5.]
27 pass
28
29 #切片操作
30 if 0:
31 s = pd.Series([1,2,3,np.nan,5,4])
32 print(s[:-3])
33
34 print(s[::2])
35
36 #索引赋值
37 if 0:
38 s = pd.Series([1,2,3,np.nan,5,4])
39 print(s)
40 s.index.name = "idx"
41 print(s)
42
43 #可以通过index 直接修改索引的值
44 s.index = list("abcdef")
45 print(s)
46 print(s[:3]) #照样可以使用
47 print(s['a':'c']) # 注,这里是包含‘c'
48 pass
49 # DataFrame
50 if 1:
51 #构造一个时间序列
52 if 0:
53 date = pd.date_range('20190901',periods=60 ) #时间序列 60 天
54 print(date)
55 #创建一个dataframe 结构
56 if 0:
57 #使用一个二维数组来创建
58 if 0:
59 df = pd.DataFrame(np.random.randn(3,4)) #3 行 4 列的正太分布二维数组传入
60 print(df)
61
62 date =pd.date_range('20190921',periods=3)
63 df2 = pd.DataFrame(np.random.randn(3,4),index=date )
64 print(df2)
65
66 df3 = pd.DataFrame(np.random.randn(3,4),index=date,columns=list('ABCD'))
67 print(df3)
68
69
70 #使用字典来创建
71 if 0:
72 arr =np.array([4]*4)
73 print(arr) #[4 4 4 4]
74 if 0:
75 #字典的每个key 代表一列,其value 可以是各种能转化为Series 的对象
76 #与series 要求不同,DataFrame 只要求每列数据类型相同
77 d = {"A":pd.date_range('20190921',periods=4),"B":pd.Timestamp('20190921'),"C":pd.Series(1,index=list("abcd")),'D':np.array([4]*4,dtype=float)}
78 df = pd.DataFrame(d)
79 print(df)
80 pass
81
82 #查看数据
83 if 1:
84 df = pd.DataFrame({"date":pd.date_range("20190921",periods=15),"a":1,"b":pd.Series([4]*15,dtype=float)})
85 #头尾数据
86 if 0:
87 #head 和 tail方法 可以分别查看 前几行和后几行 默认是5
88 print(df)
89 print(df.head())
90 print(df.tail())
91
92 print(df.head(3)) #前3行
93 print(df.tail(3)) #后3行
94
95 pass
96
97 #查看各个列的数据类型
98 if 0:
99 print(df.dtypes)
100 pass
101
102 #行标 列标 和数据
103 if 0:
104 print(df.index) #RangeIndex(start=0, stop=15, step=1)
105 print(df.columns) #Index(['date', 'a', 'b'], dtype='object')
106 print(df.values)
107
108
109
110
111 pass
112 pass
113
114 pass
115
116
117 #Pandas 读取数据及数据操作
118 if 1:
119 #读取excel 数据文件
120 if 0:
121 #此时要注意 它依赖xlrd 包,所以要按照它
122 df = pd.read_excel("d:/test.xlsx")
123 print(df.head())
124 print(df.tail())
125 pass
126
127 df = pd.read_excel("d:/test.xlsx")
128 #行操作
129 if 0:
130 print(df.iloc[0])
131 print(df.loc[0])
132
133 #查看前五行
134 print(df.iloc[:5])
135 print(df.loc[:5]) # 它和iloc的区别是 它包含了右端
136
137 pass
138
139 #添加一行 #通过定义一个Series 然后append 到dataframe 中
140 if 0:
141 dit = {"学号":17096220,"姓名":"陈典","年龄":19}
142 s = pd.Series(dit)
143 s.name = "320"
144 print(s)
145 df = df.append(s)
146 print(df[-5:])
147
148 pass
149
150 #删除一行
151 if 0:
152 print(df[-2:])
153 df = df.drop([319]) #删除319 行
154 print(df[-2:])
155
156 df = df.drop([317,318]) #也可以同时删除多行
157 print(df[-2:])
158
159 pass
160
161 #列操作
162 if 0:
163 print(df.columns) #Index(['学号', '姓名', '年龄'], dtype='object')
164 #取一列
165 if 0:
166 print(df['姓名']) #查看全部的名字
167
168 print(df['姓名'][:5]) #查看前5个名字
169 print(df['姓名'][-5:]) #查看后5个名字
170
171 #取多列
172 if 0:
173 print(df[['姓名','学号']][:5]) #取多列
174 pass
175
176 #增加一列
177 if 0:
178 df['序号'] = range(1,len(df)+1)
179 print(df[-3:])
180 pass
181
182 #删除一列
183 if 0:
184 df = df.drop('学号',axis=1) #注意要加上axis =1 默认是操作的行axis = 0
185 print(df[-5:])
186
187 pass
188
189 pass
190
191 #通过标签选择数据
192 if 0:
193 #之前的df[] 选择的都是列数据,现在是通过标签选择数据
194 #选择一行一列
195 if 0:
196 print(df.loc[1,'姓名']) #选择出 标签为1 的姓名数据
197 pass
198 #选择多行多列
199 if 0:
200 print(df.loc[316:,'姓名':'年龄']) #选择初标签为 316 到最后的标签,列是姓名和年龄的
201
202 print(df.loc[[1,2,5,310],['学号','姓名']]) #通过标签来选择数据
203 pass
204
205 pass
206
207 #条件选择
208 if 0:
209 #选择姓名为张三的所有条目
210 if 0:
211 print( df['姓名'] == '张三')
212 # print(df[df['姓名'] == '张三'])
213 print(df[df['姓名'] == '张三'][:5]) #查看前5行
214 #选择姓名为张三,且年龄大于100 的所有条目
215 if 0:
216 # print( df['姓名']=='张三' & df['年龄']>100) #不对
217 print( (df['姓名']=='张三') & (df['年龄']>100)) #多个条件要用()括起来
218 #上一行等价于下面一行
219 # print( (df.姓名 == '张三' ) & (df.年龄 >100 ) )
220
221 print(df[(df['姓名']=='张三') & (df['年龄']>100)])
222 # 选择姓名为张三或者张昌博,且 年龄大于100 小于 150 的所有条目
223 if 1:
224 #基本形式 df [ ( () | () ) & ( () &() )]
225 # df.姓名 == '张三' df.姓名 == '张昌博' df.年龄 >100 df.年龄<150
226 print(df[ ( (df.姓名 == '张三') | (df.姓名 == '张昌博') ) &( (df.年龄 >100) & (df.年龄<150) ) ])
227 pass
228
229 pass
230
231 #缺失值和异常值的处理
232 if 1:
233
234 #缺失值的处理方法
235 if 0:
236 #常用的方法:
237 # 1,dropna 根据标签的缺失值进行过滤 ,删除缺失值
238 # 2,fillna 对缺失值进行填充
239 # 3,isnull 返回一个布尔值对象,判断那些值是缺失值
240 # 4,notnull isnull 的否定式
241 pass
242
243 #利用isnull 判断缺失值
244 if 0:
245 # print( df.isnull())
246 print(df['姓名'].isnull()) #一般是判断某一类是否有缺失值
247 print(df[ df['姓名'].isnull() ])
248 pass
249
250 #填充缺失值
251 if 0:
252 # 填充一般用于数值型 的
253 if 0:
254 #判断年龄是否有缺失值
255 print( df [ df['年龄'].isnull() ] )
256
257 df['年龄'].fillna(0,inplace=True) #填充为0
258 #inplace 代表的是是否在原始数据中进行填充
259 print( df [ df['年龄'].isnull() ] )
260 #填充非数值型的
261 if 1:
262 print(df [ df['姓名'].isnull() ] )
263 df['姓名'] = df['姓名'].fillna('未知姓名')
264 print(df['姓名'][164:] )
265 pass
266
267
268 pass
269
270 #删除缺失值
271 if 1:
272 # df.dropna() 参数:
273 # how ='all' 删除全为空值的行和列
274 # inplace= True 覆盖原有数据
275 # axis =0 选择要操作的维度
276 if 0:
277 print(len(df))
278 df2 = df.dropna()
279 print(len(df2))
280
281 print(len(df))
282 df2 = df.dropna(how='all')
283 print(len(df2))
284
285 pass
286
287 #异常值的处理
288 if 0:
289 #异常值 例如 年龄为负数 等等.... 一般直接删除就好了
290 print(df[df['年龄'] < 0 ])
291 df = df[df['年龄'] >0 ] #这样就将年龄小与 0 的给删除了
292
293
294 pass
295
296 #数据保存
297 df.to_excel('d:/test02.xlsx') #注意:如果要保存到excel 要pip 安装openpyxl 模块
298 pass