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