Pandas 数据结构—Series
Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。
Series由索引(index)和列组成,函数如下:
pandas.Series(data,index,dtype,name,copy)
参数说明
创建一个简单的Series实例:
import pandas as pd a = [1,2,3] myvar = pd.Series(a) print(myvar)
输出结果如下:
从上图可知,如果没有指定索引,索引值就从0 开始,我们可以根据索引值读取数据:
import pandas as pd a = [1,2,3] myvar = pd.Series(a) print(myver[1])
输出结果为:
2
我们可以指定索引值,如下例:
import pandas as pd a = ["Google","Runoob",'Wiki'] myvar = pd.Series(a,index = ["x","y","z"]) print(myvar)
输出结果如下:
根据索引值读取数据:
import pandas as pd a = ["Google","Runoob",'Wiki'] myvar = pd.Series(a,index = ["x","y","z"]) print(myvar["y"])
输出结果如下:
Runoob
我们也可以使用key/value对象,类似字典来创建Series:
import pandas as pd sites = {1:"Google", 2:"Runoob", 3:"Wiki"} myvar = pd.Series(sites) print(myvar)
输出结果如下:
从上图可知,字典的key变成了索引值。
如果我们只需要字典的中的一部分数据,只需要指定需要数据的索引即可,如下实例:
import pandas as pd sites = {1:"Google", 2:"Runoob", 3:"Wiki"} myvar = pd.Series(sites,index = [1,2]) print(myvar)
输出结果如下:
设置Series名称参数:
import pandas as pd sites = {1:"Google", 2:"Runoob", 3:"Wiki"} myvar = pd.Series(sites,index = [1,2],name = "RUNOOB-Series-TEST") 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 data = [["Google",10],[“Runoob”,12],["Wiki",13]] df = pd.DataFrame(data,columns = ['Site','Age'],dtype = float) print(df)
输出结果如下:
以下实例用ndarrays 创建,ndarray 的长度必须相同,如果传递了index,则索引的长度应等于数组的长度,如果没有传递索引,则默认情况下,索引将是range(n),其中n是数组长度。
#使用ndarrays创建 import pandas as pd data = {'Site':['Google','Runoob','Wiki'],'Age':[10,12,13]}
#这里数组指的是['Google','Runoob','Wiki'],[10,12,13]
df = pd.DataFrame(data)
print(df)
输出结果如下:
由以上输出结果可知,DataFrame数据类型一个表格,包括rows(行),和columns(列)
还可以使用字典(key/value),其中字典的key为列名:
#使用字典创建 import pandas as pd data = [{'a':1, 'b':2},{'a':5, 'b':10, 'c':20}] df = pd.DataFrame(data) print(df)
输出结果为
没有对应的部分数据为NaN
Pandas可以使用loc属性返回指定行的数据,如果没有设置索引,第一行索引为0,第二行索引为1,以此类推:
import pandas as pd data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } # 数据载入到 DataFrame 对象 df = pd.DataFrame(data) # 返回第一行 print(df.loc[0]) # 返回第二行 print(df.loc[1])
输出结果如下:注意:返回结果其实就是一个Pandas Series数据。
#也可以返回多行数据,使用[[...]]格式,...为各行索引
import pandas as pd data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } # 数据载入到 DataFrame 对象 df = pd.DataFrame(data) # 返回第一行和第二行 print(df.loc[[0, 1]])
输出结果为:注意:返回结果其实就是一个Pandas DataFrame 数据
#我们可以指定索引值,如下实例: import pandas as pd data = { "calories":[420,380,390], "duration":[50,40,45] } df = pd.DataFrame(data, index = ["day1","day2","day3"]) print(df)
输出结果为:
Pandas可以使用loc属性返回指定索引对应到某一行:
import pandas as pd data = { "calories":[420,380,390], "duration":[50,40,45] } df = pd.DataFrame(data, index = ["day1","day2","day3"]) #指定索引 print(df.loc["day2"])
输出结果为:
Pandas CSV文件
CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)
CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。
Pandas可以很方便的处理CSV文件。
import pandas as pd df = pd.read_csv("nba.csv") print(df.to_string())
to_string() 用于返回DataFrame类型的数据,如果不使用该函数,则输出结果为数据的前面5行和末尾5行,中间部分以...代替。使用了to_string相当于全部输出
import pandas as pd df = pd.read_csv('nba.csv') print(df)
输出结果为:
我们也可以使用to_csv()方法将DataFrame存储为csv文件:
import pandas as pd #三个字段 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} df = pd.DataFrame(dict) #保存 dataframe df.to_csv('site.csv')
数据处理
1.head()
head(n)方法用于读取前面的n行,如果不填参数n,默认返回5行。
import pandas as pd df = pd.read_csv("nba.csv") print(df.head())
输出结果为:
2.tail()
tail(n)方法用于读取尾部的n行,如果不填参数n,默认返回5行,空行各个字段的值返回NaN
import pandas as pd df = pd.read_csv("nba.csv") print(df.tail())
输出结果为:
3.info()
info()方法返回表格的一些基本信息:
import pandas as pd df = pd.read_csv("nba.csv") print(df.info())
输出结果为:
non-null为非空数据,我们可以看到上面的信息中,总共458行,College字段的空值最多。
Pandas 数据清洗
数据清洗是对一些没有用的数据进行处理的过程。
很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。
本文使用到的测试数据如下:
上表包含了四种空数据:
- n/a
- NA
- —
- na
1 Pandas清洗空值
如果我们要删除包含空字段的行,可以使用dropna()方法,语法格式如下:
DataFrame.dropna(sxis = 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,修改的是源数据。
我们可以通过isnull()判断各个单元格是否为空。
import pandas as pd df = read_csv("property-data.csv") print(df['NUM_bedROOMS']) print(df['NUM_bedROOMS']).isnull()
以上实例输出结果如下:
以上例子中我们看到Pandas把n/a和NA当作空数据,而认为na不是空数据,不符合我们要求,我们可以指定空数据类型:
import pandas as pd missing_values = ["n/a", "na", "--"] df = read_csv("property-data.csv", na_values = missing_values) print(df['NUM_bedROOMS']) print(df['NUM_bedROOMS']).isnull()
以上实例输出结果如下:
接下来的实例演示了删除包含空数据的行。
import pandas as pd df = pd.read_csv("property-data.csv") new_df = df.dropna() print(new_df.to_string())
以上实例输出结果如下:
注意:默认情况下,dropna()方法返回一个新的DataFrame,不会修改源数据。
如果你要修改源数据DataFrame,可以使用inplace = True 参数:
import pandas as pd df = pd.read_csv('property-data.csv') df.dropna(inplace = True) print(df.to_string())
以上实例输出结果如下:
我们也可以移除指定列有空值的行:
import pandas as pd df = pd.read_csv("property-data.csv") df.dropna(subset = ['ST_NUM'],inplace = True) print(df.to_string())
以上实例输出结果如下:
我们也可以用fillna()方法来替换一些空字段:
import pandas as pd df = pd.read_csv("property-data.csv") df.fillna(12345,inplace = True) print(df.to_string())
以上实例输出结果如下:
我们也可以指定某一个列来替换数据:
import pandas as pd df = pd.read_csv('property-data.csv') df['PID'].fillna(12345, inplace = True)#指定替换PID列的空数据 print(df.to_string())
以上实例输出结果如下:
替换空单元格的常用方法是计算列的均值、中位数值或众数。
Pandas使用mean()、median()和mode()方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数)。
#使用mean()方法计算列的均值并替换空单元格 import pandas as pd df = pd.read_csv("property-data.csv") x = df["ST_NUM"].mean() #同理可以换成中位数median()、众数mode() df["ST_NUM"].fillna(x,inplace = True) print(df.to_string())
以上实例输出结果如下,红框为计算的均值替换来空单元格:
2 Pandas清洗格式错误数据
数据格式错误的单元格会使数据分析变得困难,我们可以通过包含空单元格的行,或者将列中的所有单元格转换为相同格式的数据
以下实例会格式化日期:
import pandas as pd #第三个日期格式错误 data = { "Date":['2020/12/01', '2020/12/02', '20201226'] "duration":[50, 40, 45] } df = pd.DataFrame(data, index = ["day1","day2","day3"]) df["Date"] = pd.to_datetime(df["Date"]) print(df.to_string())
以上实例输出结果如下:
数据错误也是很常见的情况,我们可以对错误的数据进行替换或者移除。
以下实例会替换错误年龄的数据:
import pandas as pd person = { "name":['Google','Runoob','Taobao'], "age":[50,40,12345] #这里12345 年龄数据是错误的 } df = pd.DataFrame(person) df.loc[2,'age'] = 30 #修改数据 print(df.to_string())
以上实例输出结果如下:
也可以设置条件语句:
#将age大于120的设置为120 import pandas as pd person = { "name":['Google','Runoob','Taobao'], "age":[50,200,12345] } df = pd.DataFrame(person) for x in df.index: if df.loc[x,"age"]>120: df.loc[x,"age"] = 120 print(df.to_string())
以上实例输出结果如下:
#将age大于120的设置为删除 import pandas as pd person = { "name":['Google','Runoob','Taobao'], "age":[50,40,12345] } df = pd.DataFrame(person) for x in df.index: if df.loc[x,"age"]>120: df.drop(x,inplace =True) print(df.to_string())
以上实例输出结果如下:
3 Pandas 清洗重复数据
如果我们要清洗重复数据,可以使用duplicated()和drop_dulicates()方法。
如果对应的数据是重复的,dulicated()会返回True,否则返回False
import pandas as pd person = { "name": ['Google', 'Runoob', 'Runoob', 'Taobao'], "age": [50, 40, 40, 23] df = pd.DataFrame(person) print(df.duplicated())
以上实例输出结果如下:
删除重复数据,可以直接使用drop_dulicates()方法。
import pandas as pd person = { "name": ['Google', 'Runoob', 'Runoob', 'Taobao'], "age": [50, 40, 40, 23] df = pd.DataFrame(person) df.drop_duplicates(inplace = True) print(df)
以上实例输出结果如下: