pyhton_Pandas教程
Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。
Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)。
Pandas 一个强大的分析结构化数据的工具集,基础是 numpy(提供高性能的矩阵运算)。
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
数据结构
Series 是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
一、Pandas 安装
安装 pandas 需要基础环境是 Python,开始前我们假定你已经安装了 Python 和 Pip。
1 | pip install pandas |
查看pandas的版本
1 | import pandas as pd<br><br> print (pd.__version__) |
二、Pandas 数据结构 -- Series
pandas.Series( data, index, dtype, name, copy)
data:一组数据(ndarray 类型)。
index:数据索引标签,如果不指定,默认从 0 开始。
dtype:数据类型,默认会自己判断。
name:设置名称。
copy:拷贝数据,默认为 False。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | mydataset = { 'sites' : [ "Google" , "Runoob" , "Wiki" ], 'number' : [ 1 , 2 , 3 ] } #将字典类型转化成dataframe类型 myvar = pd.DataFrame(mydataset) print (myvar) print () a = [ 1 , 2 , 3 ] myvar = pd.Series(a) print (myvar) print (myvar[ 1 ]) #指定索引查询 sites = { 1 : "Google" , 'runoob' : "Runoob" , 3 : "Wiki" } myvar = pd.Series(sites) #使用字典类型创建Series,key的值就成了索引值 print (myvar) print () # 参数index a = [ "Google" , "Runoob" , "Wiki" ] myvar = pd.Series(a, index = [ "x" , "y" , "z" ]) #index指定索引名称 print (myvar) print (myvar[ 'y' ]) print () sites = { 1 : "Google" , 2 : "Runoob" , 3 : "Wiki" } myvar = pd.Series(sites, index = [ 3 , 2 ]) #使用索引,截取字典中所需的部分 print (myvar) print () # 参数name,设置name属性 sites = { 1 : "Google" , 2 : "Runoob" , 3 : "Wiki" } myvar = pd.Series(sites, index = [ 1 , 2 ], name = "I is series(name)" ) print (myvar) |
三、Pandas 数据结构 - DataFrame
pandas.DataFrame( data, index, columns, dtype, copy)
data:一组数据(ndarray、series, map, lists, dict 等类型)。
index:索引值,或者可以称为行标签。
columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
dtype:数据类型。
copy:拷贝数据,默认为 False。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | data = [[ 'Google' , 10 ],[ 'Runoob' , 12 ],[ 'Wiki' , 13 ]] df = pd.DataFrame(data,columns = [ 'Site' , 'Age' ],dtype = float ) # 列表转dataframe print (df) data = { 'Site' :[ 'Google' , 'Runoob' , 'Wiki' ], 'Age' :[ 10 , 12 , 13 ]} df = pd.DataFrame(data) # 字典转dataframe print (df) data = [{ 'a' : 1 , 'b' : 2 },{ 'a' : 5 , 'b' : 10 , 'c' : 20 }] df = pd.DataFrame(data) print (df) data = { "calories" : [ 420 , 380 , 390 ], "duration" : [ 50 , 40 , 45 ] } df = pd.DataFrame(data) print (df) print (df.loc[ 0 ]) # 使用df.loc[]返回第一行 print (df.loc[ 1 ]) # 使用df.loc[]返回第一行 print (df.loc[[ 0 , 1 ]]) # 使用df.loc[[ ]]返回两行数据 print (df.loc[ 0 : 1 ,[ 'calories' ]]) # 使用df.loc[a:b ,[' ']]返回指定某列 a~b的数据 data = { "calories" : [ 420 , 380 , 390 ], "duration" : [ 50 , 40 , 45 ] } df = pd.DataFrame(data, index = [ "day1" , "day2" , "day3" ]) #指定索引值 print (df) print (df.loc[ 'day2' ]) |
四、Pandas CSV 文件
1、read_csv() 将csv()文件导入,存在Dataframe对象中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd # pd.read_csv() 读取csv文件 df = pd.read_csv( './nba.csv' ,encoding = 'GBK' ) print (df.to_string()) print (df.loc[:,[ 'Name' ]]) #获取列 # head() print (df.head().to_string()) #默认获取前5行 print (df.head( 3 ).to_string()) #获取前3行 # tail() print (df.tail().to_string()) #默认获取后5行 print (df.head( 3 ).to_string()) #获取后3行 # info() 返回表格的一些基本信息 print (df.info()) |
2、to_csv() 将 DataFrame 存储为 csv 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd # 使用 to_csv() 方法将 DataFrame 存储为 csv 文件 nme = [ "Google" , "Runoob" , "Taobao" , "Wiki" ] st = [ "www.google.com" , "www.runoob.com" , "www.taobao.com" , "www.wikipedia.org" ] ag = [ 90 , 40 , 80 , 98 ] dict = { 'name' : nme, 'site' : st, 'age' : ag} df = pd.DataFrame( dict ) # print(df) df.to_csv( './aaa.csv' ) # 保存 dataframe到该文件夹下 df.to_csv(r 'C:\Users\Public\Desktop\a1.csv' ,encoding = 'utf8' ) # 保存 dataframe到指定路径 path = r "C:\Users\Public\Desktop" wen = '\ccc.csv' df.to_csv(path + wen,encoding = 'utf8' ) |
3、to_string() 用于返回 DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 ... 代替。
1 2 3 | import pandas as pd<br> df = pd.read_csv( 'nba.csv' ) print (df) |
五、Pandas JSON
1、JSON 对象与 Python 字典具有相同的格式,所以我们可以直接将 Python 字典转化为 DataFrame 数据:
1 2 3 4 5 6 7 8 9 10 | import pandas as pd # 字典格式的 JSON s = { "col1" :{ "row1" : 1 , "row2" : 2 , "row3" : 3 }, "col2" :{ "row1" : "x" , "row2" : "y" , "row3" : "z" } } # 读取 JSON 转为 DataFrame df = pd.DataFrame(s) print (df) |
以上实例输出结果为:
1 2 3 4 | col1 col2 row1 1 x row2 2 y row3 3 z |
2、从 URL 中读取 JSON 数据:
1 2 3 4 5 | import pandas as pd URL = 'https://static.runoob.com/download/sites.json' df = pd.read_json(URL) print (df) |
六、Pandas 数据清洗
数据清洗是对一些没有用的数据进行处理的过程。
很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。
在这个教程中,我们将利用 Pandas包来进行数据清洗。
1、Pandas 清洗空值
如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:
1 2 3 4 5 | DataFrame.dropna(axis = 0 , how = 'any' , thresh = None , subset = None , inplace = False )参数说明: axis: 默认为 0 ,表示逢空值剔除整行,如果设置参数 axis= 1 表示逢空值去掉整列。 how: 默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how = 'all' 一行(或列)都是 NA 才去掉这整行。 thresh: 设置需要多少非空值的数据才可以保留下来的。 subset: 设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。 inplace:如果设置 True ,将计算得到的值直接覆盖之前的值并返回 None ,修改的是源数据。默认为 False |
1.1、添加na_values属性指定的某些数据修改为空数据(NaN)
1 2 3 4 | # df = pd.read_csv(r'C:\Users\Administrator\Desktop\property-data.csv') missing_values = [ "n/a" , "na" , "--" , "N" , "Y" ] df1 = pd.read_csv( './property-data.csv' ) df2 = pd.read_csv( './property-data.csv' ,na_values = missing_values) #添加na_values属性指定的某些数据修改为空数据(NaN)<br>print(df1)<br>print(df2)<br># print(df2['SQ_FT'].isnull())#判断某列中的各个单元格是否为空 |
1.2、 dropna() 方法 返回一个新的 DataFrame,不会修改源数据。
1 2 3 4 5 | # 如果你要修改源数据 DataFrame, 可以使用 inplace = True 参数: new_df = df1.dropna() #如果某行中有一个单元格数据为空则删除整行 new_df2 = df1.dropna(subset = [ 'NUM_BATH' ]) # 某指定列如果有空数据,则删除空数据所在行 print (new_df) # print(new_df2) |
1.3、 fillna()方法 来替换一些空字段
1 2 3 4 | df3 = df1.fillna( '666' ) #添加 inplace=True属性会改变源数据 df4 = df1[ 'NUM_BEDROOMS' ].fillna( '555' ) #指定某列获取数据并替换空数据 print (df3) print (df4) |
1.4、使用 mean() 方法计算列的均值并替换空单元格
1 2 3 4 | x = df1[ "ST_NUM" ].mean() #指定某列进行平均值计算 df1[ "ST_NUM" ].fillna(x, inplace = True ) #使用fillna()方法进行数据替换 print (x) print (df1) |
1.5、使用 median() 方法计算列的中位数并替换空单元格:
1 2 3 4 | x = df1[ "PID" ].median() df1_1 = df1[ "PID" ].fillna(x) print (x) print (df1_1) |
1.6、使用 mode() 方法计算列的众数并替换空单元格
1 2 3 4 | x = df1[ "PID" ].mode() df1[ "PID" ].fillna(x,inplace = True ) print (x) print (df1) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通