一、Pandas简介
1、Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
2、Pandas 是python的一个数据分析包,最初由AQR Capital
Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。
Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel
data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。
二、数据类型
Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
Time- Series:以时间为索引的Series。
DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
Panel :三维的数组,可以理解为DataFrame的容器。
Pandas 有两种自己独有的基本数据结构。读者应该注意的是,它固然有着两种数据结构,因为它依然是 Python 的一个库,所以,Python 中有的数据类型在这里依然适用,也同样还可以使用类自己定义数据类型。只不过,Pandas 里面又定义了两种数据类型:Series 和 DataFrame,它们让数据操作更简单了。
三、Pandas使用
1、导入pandas模块并使用别名,以及导入Series模块
import pandas as pd
from pandas import Series
2、读取文件
food_info = pd.read_csv('food_info.csv') #比较常用
print(type(food_info))
print(food_info.dtypes) #pandas中字符型为object
print(help(pd.read_csv))
3、head(x)方法显示前x行数据,默认为5行
tail(x)方法显示后x行数据,默认为5行
food_info.head()
food_info.tail()
4、显示当前所有列名
food_info.columns
5、loc[ ]方法提取数据,按行取
food_info.loc[0]
food_info.loc[0:6]#进行切片索引
food_info.loc[88,'Water_(g)']
#提取Water_(g)列中第88个元素的值,左边为提取元素的下标,右边为元素所在列名
6、通过列名提取一列数据
food_info['NDB_No']
7、tolist() 方法将数组转换成一个列表
endswith(x)方法判断数据是否以x结尾
col_names = food_info.columns.tolist()
print(col_names)
gram_columns = []
for i in col_names:
if i.endswith('(g)'): #判断这些列明是否以 (g) 结尾
gram_columns.append(i)
gram_df = food_info[gram_columns]
print(gram_df.head())
8、数学计算加、减、乘、除
print(food_info['Iron_(mg)'])
div_1000 = food_info['Iron_(mg)'] / 1000 #给某一列除以1000
print(div_1000)
9、对两列进行计算,当两列的长度相同时,相同位置的数据会进行计算结果会放在原来的位置。
向原始数据中添加一列数据,这列数据的维度必须要好原始数据相对应
water_energy = food_info['Water_(g)'] * food_info['Energ_Kcal']
iron_grams = food_info['Iron_(mg)'] / 1000
print(food_info.shape)
food_info['Iron_(g)'] = iron_grams
print(food_info.shape)
10、几种常用函数
min()求最小值 max()求最大值 mean()求平均值
max_cal = food_info['Energ_Kcal'].max() #求最大值
normal = food_info['Energ_Kcal'] / max_cal
normal1 = food_info['Protein_(g)'] / food_info['Protein_(g)'].max()
normal2 = food_info['Lipid_Tot_(g)'] / food_info['Lipid_Tot_(g)'].max()
food_info['Normal_Protein'] = normal1
food_info['Normal_Fat'] = normal2
print(max_cal)
print(food_info.columns)
11、排序 sort_values() 默认为从小到大进行排序,如果要从大到小排序则要加上ascending=False
food_info.sort_values('Sodium_(mg)',inplace=True)
# 按照'Sodium_(mg)'列进行排序,inplace=True表示生成一个新的DataFram,而不是在原来的基础上排序,不改变原始值
print(food_info['Sodium_(mg)'])
调用reset_index(drop=True)方法对索引进行排序,可以先对数据排序,在对索引排序,这样数据会更加整洁
titanic_reindexed = new_titanic_survival.reset_index(drop=True)
#排序索引值,
12、pd.isnull(x) 判断x中是否有缺失值,返回值为布尔值(True/False),True表示有缺失,False表示没有。
titanic_survial = pd.read_csv('titanic_train.csv')
titanic_survial.head()
age_is_null = pd.isnull(age)
print(age_is_null)
print(age[age_is_null]) #索引出所有空值
print(len(age_is_null)) #计算控制的长度
13、快速统计缺失值的个数
pd.isnull(titanic_survial).sum() #调用sum()函数计算缺失值的个数
titanic_survial
14、填充缺失值
titanic_survial = titanic_survial.fillna('DX')
#调用fillna()方法,括号内为替换值
15、删除缺失值
axis=1 表示按列操作
drop_na_columns = titanic_survial.dropna(axis=1)#
new_titantic_survival = titanic_survial.dropna(axis=0,subset=['Age','Sex'])
16、数据透视表,调用pivot_table()方法,它表示一个量与另一个量之间的关系
index 和 values 表示要统计的两个变量,aggfunc 表示这两个量之间的关系,如果没有指明aggfunc则默认为求平均值
passenger_survival = titanic_survial.pivot_table(index='Pclass',values='Survived',aggfunc=np.mean)
print(passenger_survival)
17、函数操作apply(x),它主要应用于Series数据结构,可以调用函数x
def hundredth_row(column):
hundredth_item = column.loc[99]
return hundredth_item
hundredth_row = titanic_survial.apply(hundredth_row)
print(hundredth_row)
18、DataFrame相当于刚读取进来的一个文件,像是一个表,而Series则就是其中的一行或者一列
Series(DataFrame里面的结构是Series,Series里面的结构是ndarray数组)
Series 就如同列表一样,一系列数据,每个数据对应一个索引值。
18.1Series 就是“竖起来”的 list
s = Series([1,4,'www','tt'])
s
18.2另外一点也很像列表,就是里面的元素的类型,由你任意决定(其实是由需要来决定)
这里,我们实质上创建了一个 Series 对象,这个对象当然就有其属性和方法了。比如,下面的两个属性依次可以显示 Series 对象的数据值和索引
print(s.index)
print(s.values)
18.3列表的索引只能是从 0 开始的整数,Series 数据类型在默认情况下,其索引也是如此。不过,区别于列表的是,Series 可以自定义索引
s2 = Series(['wangxing','man',24],index=['name','sex','age'])
s2
18.4每个元素都有了索引,就可以根据索引操作元素了。还记得 list 中的操作吗?Series 中,也有类似的操作。先看简单的,根据索引查看其值和修改其值
s2['name']
s2['name'] = 'wudadiao'
s2
18.5这是不是又有点类似 dict 数据了,在前面定义 Series 对象的时候,用的是列表,即 Series() 方法的参数中,第一个列表就是其数据值,如果需要定义 index,放在后面,依然是一个列表。除了这种方法之外,还可以用下面的方法定义 Series 对象
sd = {'python':9000,'c++':9001,'c#':9000}
s3 = Series(sd)
s3
18.6这时候,索引依然可以自定义。Pandas 的优势在这里体现出来,如果自定义了索引,自定的索引会自动寻找原来的索引,如果一样的,就取原来索引对应的值,这个可以简称为“自动对齐”。
s4 = Series(sd,index=['java','c++','c#'])
s4
18.7在 Pandas 中,如果没有值,都对齐赋给 NaN。
Pandas 有专门的方法来判断值是否为空。
此外,Series 对象也有同样的方法
pd.isnull(s4)
s4.isnull()
18.8其实,对索引的名字,是可以从新定义的
s4.index = ['语文','数学','English']
s4
18.9做一些数学计算
print(s4 * 2)
print( s4[s4 > 9000])
19、DataFrame
DataFrame 是一种二维的数据结构,它的竖行叫做 columns,横行跟前面的 Series 一样,称之为 index,也就是说可以通过 columns 和 index 来确定一个主句的位置。
19.1导入模块
from pandas import Series,DataFrame
data = {"name":['google','baidu','yahoo'],"marks":[100,200,300],"price":[1,2,3]}
f1 = DataFrame(data)
f1
19.2这是定义一个 DataFrame 对象的常用方法——使用 dict 定义。字典的“键”(“name”,“marks”,“price”)就是 DataFrame 的 columns 的值(名称),字典中每个“键”的“值”是一个列表,它们就是那一竖列中的具体填充数据。上面的定义中没有确定索引,所以,按照惯例(Series 中已经形成的惯例)就是从 0 开始的整数。从上面的结果中很明显表示出来,这就是一个二维的数据结构(类似 excel 或者 mysql 中的查看效果)。
上面的数据显示中,columns 的顺序没有规定,就如同字典中键的顺序一样,但是在 DataFrame 中,columns 跟字典键相比,有一个明显不同,就是其顺序可以被规定,向下面这样做
f2 = DataFrame(data,columns=['name','price','marks'])
19.3跟 Series 类似的,DataFrame 数据的索引也能够自定义
f3 = DataFrame(data,columns=['name','marks','price'],index=['a','b','c'])
f3
19.4定义 DataFrame 的方法,除了上面的之外,还可以使用“字典套字典”的方式。
newdata = {'lang':{'first':'python','second':'java'},'price':{'first':5000,'second':2000}}
f4 = DataFrame(newdata)
f4
19.5在字典中就规定好数列名称(第一层键)和每横行索引(第二层字典键)以及对应的数据(第二层字典值),也就是在字典中规定好了每个数据格子中的数据,没有规定的都是空。
DataFrame 对象的 columns 属性,能够显示素有的 columns 名称。并且,还能用下面类似字典的方式,得到某竖列的全部内容(当然包含索引)
newdata = {"lang":{"firstline":"python","secondline":"java"}, "price":{"firstline":8000}}
f4 = DataFrame(newdata)
f4
DataFrame(newdata, index=["firstline","secondline","thirdline"])
19.6DataFrame 对象的 columns 属性,能够显示所有的 columns 名称。并且,还能用下面类似字典的方式,得到某竖列的全部内容(当然包含索引
f3['name']
19.7下面操作是给同一列赋值
newdata1 = {'username':{'first':'wangxing','second':'dadiao'},'age':{'first':24,'second':25}}
f6 = DataFrame(newdata1,columns=['username','age','sex'])
print(f6)
f6['sex'] = 'man'
print(f6)
19.8也可以单独的赋值,除了能够统一赋值之外,还能够“点对点”添加数值,结合前面的 Series,既然 DataFrame 对象的每竖列都是一个 Series 对象,那么可以先定义一个 Series 对象,然后把它放到 DataFrame 对象中。如下
ssex = Series(['男','女'],index=['first','second'])
f6['sex'] = ssex
f6
19.9还可以更精准的修改数据,完全仿照字典的操作
f6['age']['second'] = 30
f6