Python-pandas
Pandas 应用
Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。
数据结构
Series 是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
Pandas 安装
pip install pandas
安装成功后,我们就可以导入 pandas 包使用:
import pandas as pd
实例 – 查看 pandas 版本
import pandas as pd pd.__version__ # 查看版本
Pandas 数据结构 – Series
Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。
Series 由索引(index)和列组成,函数如下:
pandas.Series( data, index, dtype, name, copy)
参数说明:
-
data:一组数据(ndarray 类型)。
-
index:数据索引标签,如果不指定,默认从 0 开始。
-
dtype:数据类型,默认会自己判断。
-
name:设置名称。
-
copy:拷贝数据,默认为 False。
实例:
import pandas as pd print(pd.__version__) # 定义字典 mydataset = { 'sites': ["Google", "Runoob", "Wiki"], 'number': [1, 2, 3] } # 将字典转换 myvar = pd.DataFrame(mydataset) print(myvar) print("*"*50) # 将列表转换为Series a=[1,2,3] myvar=pd.Series(a) print(myvar) print("*"*50) # 指定series的索引值 a = ["Google", "Runoob", "Wiki"] myvar = pd.Series(a, index = ["x", "y", "z"]) print(myvar["y"]) print("*"*50) # 也可以使用 key/value 对象,类似字典来创建 Series: sites = {1: "Google", 2: "Runoob", 3: "Wiki"} myvar=pd.Series(sites) print(myvar) print("*"*50) # 只需要字典中的一部分数据,只需要指定需要数据的索引即可 sites = {1: "Google", 2: "Runoob", 3: "Wiki"} myvar=pd.Series(sites,index=[1,2]) print(myvar)
Pandas 数据结构 – DataFrame
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
DataFrame 构造方法如下:
pandas.DataFrame( data, index, columns, dtype, copy)
参数说明:
-
data:一组数据(ndarray、series, map, lists, dict 等类型)。
-
index:索引值,或者可以称为行标签。
-
columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
-
dtype:数据类型。
-
copy:拷贝数据,默认为 False。
Pandas DataFrame 是一个二维的数组结构,类似二维数组。
import pandas as pd # Pandas DataFrame 是一个二维的数组结构,类似二维数组。 data = [['Google',10],['Runoob',12],['Wiki',13]] df = pd.DataFrame(data,columns=['Site','Age'],dtype=float) print(df) print("*"*50) data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]} df=pd.DataFrame(data) print(df) print("*"*50) # 从以上输出结果可以知道, DataFrame 数据类型一个表格,包含 rows(行) 和 columns(列),还可以使用字典(key/value),其中字典的 key 为列名: data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}] df = pd.DataFrame(data) print(df) print("*"*50) # Pandas 可以使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推: data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } #数据载入到DataFrame对象 df=pd.DataFrame(data) #返回第一行 print(df.loc[0]) #返回第三行 print(df.loc[2]) # 也可以返回多行数据,使用 [[ ... ]] 格式,... 为各行的索引,以逗号隔开: print(df.loc[[0, 1]]) print("*"*50) # 可以指定索引值 data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } df = pd.DataFrame(data,index=["d1","d2","d3"]) print(df) # Pandas 可以使用 loc 属性返回指定索引对应到某一行 print(df.loc["d2"])
Pandas CSV 文件
CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
CSV 是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。
#实例 import pandas as pd df = pd.read_csv('nba.csv') print(df.to_string())
to_string() 用于返回 DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 … 代替。
import pandas as pd df = pd.read_csv("nba.csv") # print(df.to_string()) df.to_csv('nba.csv') #读取前5行(默认5行) print(df.head()) #读取前10行 # print(df.head(10)) #读取尾部行号(默认5行) # print(df.tail(10)) # info() 方法返回表格的一些基本信息: print(df.info()) # 也可以使用 to_csv() 方法将 DataFrame 存储为 csv 文件 # 三个字段 name, site, age 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} #将字典转换为DataFrame df02=pd.DataFrame(dict) df02.to_csv('site.csv')
Pandas JSON
JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。
一组json数据
[ { "id": "A001", "name": "菜鸟教程", "url": "www.runoob.com", "likes": 61 }, { "id": "A002", "name": "Google", "url": "www.google.com", "likes": 124 }, { "id": "A003", "name": "淘宝", "url": "www.taobao.com", "likes": 45 } ]
实例:
import pandas as pd import json df = pd.read_json('sites.json') # print(df.to_string()) # JSON 对象与 Python 字典具有相同的格式,所以我们可以直接将 Python 字典转化为 DataFrame 数据 # 字典格式的 JSON s = { "col1":{"row1":1,"row2":2,"row3":3}, "col2":{"row1":"x","row2":"y","row3":"z"} } # 读取 JSON 转为 DataFrame df02=pd.DataFrame(s) # print(df02) # 从 URL 中读取 JSON 数据 URL='https://static.runoob.com/download/sites.json' df03 = pd.read_json(URL) # print(df03) # 内嵌的 JSON 数据 df04 = pd.read_json('nested_list.json') # print(df04.to_string()) # 这时我们就需要使用到 json_normalize() 方法将内嵌的数据完整的解析出来 # 使用 Python JSON 模块载入数据 with open('nested_list.json','r') as f: data = json.loads(f.read()) #展平数据 df_list = pd.json_normalize(data, record_path=['students'], meta=['school_name','class']) print(df_list)
Pandas 数据清洗
数据清洗是对一些没有用的数据进行处理的过程。
很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。
import pandas as pd # 要删除包含空字段的行,可以使用 dropna() 方法 # 通过 isnull() 判断各个单元格是否为空 df = pd.read_csv('property-data.csv') print(df['NUM_BEDROOMS']) print(df['NUM_BEDROOMS'].isnull()) print("——"*50) # 以上例子中我们看到 Pandas 把 n/a 和 NA 当作空数据, # na 不是空数据,不符合我们要求,我们可以指定空数据类型: missing_value=['n/a','na','--'] df02 = pd.read_csv('property-data.csv',na_values=missing_value) print(df02['NUM_BEDROOMS']) print(df02['NUM_BEDROOMS'].isnull()) print("——"*50) # 删除包含空数据的行 df03 = pd.read_csv('property-data.csv') new_df03 = df03.dropna() print(new_df03.to_string()) print("——"*50) # 默认情况下,dropna() 方法返回一个新的 DataFrame,不会修改源数据。 # 如果你要修改源数据 DataFrame, 可以使用 inplace = True 参数: df04 = pd.read_csv('property-data.csv') df04.dropna(inplace=True) print(df04.to_string()) print("——"*50) # 移除 ST_NUM 列中字段值为空的行: df05 = pd.read_csv('property-data.csv') df05.dropna(subset=['ST_NUM'],inplace=True) print(df05) print("——"*50) # fillna() 方法来替换一些空字段: df06 = pd.read_csv('property-data.csv') df06.fillna(12345,inplace=True) print(df06.to_string()) print("——"*50) # 也可以指定某一个列来替换数据:使用 999 替换 PID 为空的数据 df07 = pd.read_csv('property-data.csv') df07['PID'].fillna(999,inplace=True) print(df07.to_string()) print("——"*50) # Pandas使用 mean()、median() 和 mode() # 方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数) # 使用 mean() 方法计算列的均值并替换空单元格: df08 = pd.read_csv('property-data.csv') x = df["ST_NUM"].mean() df08.fillna(x,inplace=True) print(df08.to_string()) # 使用 median() 方法计算列的中位数并替换空单元格: df08 = pd.read_csv('property-data.csv') x=df['ST_NUM'].median() df08.fillna(x,inplace=True) print(df08.to_string()) print("——"*50) # Pandas 清洗格式错误数据 # 第三个日期格式错误 data = { "Date": ['2020/12/01', '2020/12/02' , '20201226'], "duration": [50, 40, 45] } df09 = pd.DataFrame(data,index=['d1','d2','d3']) df09['Date'] = pd.to_datetime(df09['Date']) print(df09.to_string()) print("——"*50) # Pandas 清洗错误数据 person = { "name": ['Google', 'Runoob' , 'Taobao'], "age": [50, 40, 12345] # 12345 年龄数据是错误的 } df10 = pd.DataFrame(person) # 修改错误的年龄 df10.loc[2,'age']=30 print(df10.to_string()) # 也可以设置条件语句: person = { "name": ['Google', 'Runoob' , 'Taobao'], "age": [50, 40, 12345] # 12345 年龄数据是错误的 } df10 = pd.DataFrame(person) for x in df10.index: if df10.loc[x,'age']>120: df10.loc[x,'age']=18 print(df10.to_string()) # 也可以将错误数据的行删除: person = { "name": ['Google', 'Runoob' , 'Taobao'], "age": [50, 40, 12345] # 12345 年龄数据是错误的 } df10 = pd.DataFrame(person) for x in df10.index: if df10.loc[x,'age']>120: df10.drop(x,inplace=True) print(df10.to_string()) print("——"*50) # Pandas 清洗重复数据 # 如果我们要清洗重复数据,可以使用 duplicated() 和 drop_duplicates() 方法。 # 如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False。 person = { "name": ['Google', 'Runoob', 'Runoob', 'Taobao'], "age": [50, 40, 40, 23] } df11 = pd.DataFrame(person) print(df11.duplicated()) print("——"*20) # 删除重复数据,可以直接使用drop_duplicates() 方法。 person = { "name": ['Google', 'Runoob', 'Runoob', 'Taobao'], "age": [50, 40, 40, 23] } df11 = pd.DataFrame(person) df11.drop_duplicates(inplace=True) print(df11)