返回顶部

Pandas 第一部分

  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
View Code

 

posted @ 2019-09-21 15:39  Zcb0812  阅读(195)  评论(0编辑  收藏  举报