python中pandas库的使用
pandas对Numpy进行了封装,简化了操作。其数据结构主要是DataFrame(类似于多维数组)和Series(类似于一维数组)。
一、安装
pip install pandas
二、引用
import pandas as pd
三、Series对象
-
创建
- 语法:pd.Series(data=None,index=None,dtype=None)
- data - 可以是列表、字典、ndarray以及标量
- index - 索引,默认从0开始的整数序列
- dtype - 指定数据类型
>>> pd.Series([10,20,30,40,50]) #列表形式,不指定index,默认从0开始整数序列 0 10 1 20 2 30 3 40 4 50 dtype: int64 >>> pd.Series([10,20,30,40,50],index=list('abcde')) #列表形式,指定index a 10 b 20 c 30 d 40 e 50 dtype: int64 >>> pd.Series([10,20,30,40,50],index=list('abcde'),dtype=float) #列表形式,指定index和dtype,数据强转成float类型 a 10.0 b 20.0 c 30.0 d 40.0 e 50.0 dtype: float64 >>> pd.Series({'a':100,'b':200,'c':300}) #字典形式 a 100 b 200 c 300 dtype: int64 >>> pd.Series(np.arange(10,15)) #ndarray形式 0 10 1 11 2 12 3 13 4 14 dtype: int64 >>> pd.Series(6,index=list('abc')) #标量形式 a 6 b 6 c 6 dtype: int64
-
支持字典特性
- in
- get(key,default)
>>> data = pd.Series(np.arange(10,15),index=list('abcde')) >>> data a 10 b 11 c 12 d 13 e 14 dtype: int64 >>> 'a' in data True >>> 'f' in data False >>> data.get('m',100) 100
-
常用属性
- index - 获取属性
- values - 获取值
>>> data = pd.Series(np.arange(10,15),index=list('abcde')) >>> data.index Index(['a', 'b', 'c', 'd', 'e'], dtype='object') >>> data.values array([10, 11, 12, 13, 14])
-
常用方法
- 排序
- sort_values()
- 通过ascending参数来确定升序还是降序,True表示升序
- sort_values()
- 空判断
- isnull() - 判空
- notnull() - 判非空
- 缺失值处理
- dropna()
- 删除
- fillna()
- 设置默认值
- dropna()
- 去重
- drop_duplicates()
- value_counts()
- 数据按照频率进行排序,默认按照降序
- 参数ascending默认:False,表示降序,True则表示升序
- 统计基本信息
- describe()
>>> data a 10 b 11 c 12 d 13 e 14 dtype: int64 >>> data.sort_values(ascending = False) #降序排序 e 14 d 13 c 12 b 11 a 10 dtype: int64 >>> data = pd.Series([100,200,np.nan,200,np.nan,400],list('abcdef')) #创建含有缺失值的对象 >>> data a 100.0 b 200.0 c NaN d 200.0 e NaN f 400.0 dtype: float64 >>> data.isnull() #判空 a False b False c True d False e True f False dtype: bool >>> data.notnull() #判非空 a True b True c False d True e False f True dtype: bool >>> data.dropna() #删除缺失值 a 100.0 b 200.0 d 200.0 f 400.0 dtype: float64 >>> data.fillna(data.mean()) #设置默认值为均值 a 100.0 b 200.0 c 225.0 d 200.0 e 225.0 f 400.0 dtype: float64 >>> data.drop_duplicates() #去重 a 100.0 b 200.0 c NaN f 400.0 dtype: float64 >>> data.value_counts() #统计频率 200.0 2 100.0 1 400.0 1 dtype: int64 >>> data.describe() #对数据进行基本统计,统计时自动去掉了缺失值 count 4.000000 mean 225.000000 std 125.830574 min 100.000000 25% 175.000000 50% 200.000000 75% 250.000000 max 400.000000 dtype: float64
- describe()
- 排序
-
索引和切片
- 既可以根据键,也可以根据下标,但不能混用
- 索引为整数时,键的优先级更高
- 切片为整数时,只会按照下标
- .loc[] - 严格按照键进行索引和切片
- .iloc[] - 严格按照下标进行索引和切片
- 为了更放心准确的使用,最好使用.loc和.iloc这种形式
- 支持数组索引:data[[x1,x2...]]或者data[[False,True...]](bool过滤)
>>> data = pd.Series(np.arange(10,15),index=list('abcde')) #索引为非整数序列 >>> data a 10 b 11 c 12 d 13 e 14 dtype: int64 >>> data['a'] #根据键进行索引 10 >>> data.loc['a'] #严格按照键进行索引 10 >>> data['a':'d'] #根据键进行切片,不同于普通下标切片,结果包含最后一个 a 10 b 11 c 12 d 13 dtype: int64 >>> data.loc['a':'d'] #严格按照键来切片 a 10 b 11 c 12 d 13 dtype: int64 >>> data[3] #按下标进行索引 13 >>> data.iloc[3] #严格按下标进行索引 13 >>> data[2:4] #按下标进行切片,结果不包含':'右边这个下标 c 12 d 13 dtype: int64 >>> data.iloc[2:4] #严格按下标进行切片 c 12 d 13 dtype: int64 >>> data2 = pd.Series(np.arange(10,15),index=range(2,7)) #索引为整数序列 >>> data2 2 10 3 11 4 12 5 13 6 14 dtype: int64 >>> data2[2] #整数索引,键的优先级更高 10 >>> data2.iloc[2] #严格按照下标索引,结果是第三个值12 12 >>> data2[2:4] #整数切片,只会按照下标 4 12 5 13 dtype: int64 >>> data2.loc[2:4] #指定按照键来切片,结果获得键为2、3、4的值 2 10 3 11 4 12 dtype: int64 >>> data2[[2,4]] #传入数组,分别获取键为2和4的索引值 2 10 4 12 dtype: int64 >>> data2[(data2>11) & (data2<14)] #过滤11-14之间的数 4 12 5 13 dtype: int64
四、DataFrame对象
-
创建
- 语法:pd.DataFrame(value,index,dtype)
- index - 指定行索引
- dtype - 指定数据类型
- 二维ndarray对象创建
- 字典形式
- 键:列名
- 值:一维数组,列表,Series对象
>>> pd.DataFrame(np.arange(15).reshape(3,5)) #通过二维数组创建,自动添加行索引和列索引 0 1 2 3 4 0 0 1 2 3 4 1 5 6 7 8 9 2 10 11 12 13 14 >>> pd.DataFrame(np.arange(15).reshape(3,5),index=list('abc')) #通过index参数指定行索引 0 1 2 3 4 a 0 1 2 3 4 b 5 6 7 8 9 c 10 11 12 13 14 >>>pd.DataFrame({"first":np.arange(1,5),"second":np.arange(5,9)}) #字典值为一维数组 first second 0 1 5 1 2 6 2 3 7 3 4 8 >>> pd.DataFrame({"first":[1,2,3],"second":[4,5,6]},index=list('abc')) #字典值为列表 first second a 1 4 b 2 5 c 3 6 >>> pd.DataFrame({"first":pd.Series([1,2,3],index=list('abc')),"second":pd.Series([6,7,8,9],index=list('bcde'))}) #值为Series对象 first second a 1.0 NaN b 2.0 6.0 c 3.0 7.0 d NaN 8.0 e NaN 9.0
- 语法:pd.DataFrame(value,index,dtype)
-
读取excel文件
- pd.read_excel()
>>> pd.read_excel('ship_ticket.xlsx',names=['name','age','class','fares'],dtype={'fares':float}) #names参数可以添加或重设列名 name age class fares 0 PFp 22 1 121.0 1 UtG 45 1 143.0 2 NWT 49 1 171.0 3 pHK 45 2 71.0 4 1AD 24 3 42.0 .. ... ... ... ... 195 BO6 29 1 165.0 196 Xcu 45 1 193.0 197 LPB 35 3 26.0 198 0kx 40 2 89.0 199 ulK 41 2 87.0 [200 rows x 4 columns]
- pd.read_excel()
-
常用属性:
- index - 行索引
- columns - 列索引
- values - 二维数组的形式显示所有值
- shape - 返回行和列大小的一个元组
- T - 转置
>>> data first second a 1 4 b 2 5 c 3 6 >>> data.index #行索引 Index(['a', 'b', 'c'], dtype='object') >>> data.columns #列索引 Index(['first', 'second'], dtype='object') >>> data.values #以二维数组的形式显示所有值 array([[1, 4], [2, 5], [3, 6]]) >>> data.shape #行和列大小 (3, 2) >>> data.T #转置 a b c first 1 2 3 second 4 5 6
-
常用方法:
- head()
- 预览前几行数据,默认5行
- tail()
- 预览后几行数据,默认5行
- count()
- 统计每一列中非空值数量
- describe()
- -对每一列数据进行简单统计分析
- rename()
- 给某些列重命名
- data.rename(columns = {'旧列名1':’新列名1‘...})
- drop()
- 根据指定索引删除行或列
- 参数axis:0,删除行,1,则删除列
- sort_values()
- 按照列索引进行排序
- reset_index()
- 重新设置索引值,从0开始的整数序列
- 参数drop=True,表示删除原有行索引值
- 一般在排序后进行该操作
- pivot_table()
- 数据透视表
- 参数:values,index,aggfunc
- 先按照index指定的列进行分组,然后根据aggfunc指定的聚合运算函数,对values指定的列进行相应的聚合运算
- dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
- 删除包含缺少值的行或列
- 参数axis=0: 删除包含缺失值的行,axis=1: 删除包含缺失值的列
- 参数how: 与axis配合使用,how=‘any’ :只要有缺失值出现,就删除该行或列,how=‘all’: 所有的值都缺失,才删除行或列
- 参数thresh: 行或列中至少有thresh个非缺失值,否则删除,比如 axis=0,thresh=10,表示某行中非缺失值的数量小于10,将删除改行
- 参数subset: list类型,可以对指定列进行缺失值判断
- 参数inplace:表示是否在源数据上操作
- fillna()
- 给缺失值设置默认值
- drop_duplicates()
- 参数subset指定哪些列中有重复数据时,删除行数据
>>> data = pd.read_excel('ship_ticket.xlsx') >>> data name age class fares 0 PFp 22 1 121 1 UtG 45 1 143 2 NWT 49 1 171 3 pHK 45 2 71 4 1AD 24 3 42 .. ... ... ... ... 195 BO6 29 1 165 196 Xcu 45 1 193 197 LPB 35 3 26 198 0kx 40 2 89 199 ulK 41 2 87 [200 rows x 4 columns] >>> data.head() #显示前5行 name age class fares 0 PFp 22 1 121 1 UtG 45 1 143 2 NWT 49 1 171 3 pHK 45 2 71 4 1AD 24 3 42 >>> data.tail(3) #显示后3行 name age class fares 197 LPB 35 3 26 198 0kx 40 2 89 199 ulK 41 2 87 >>> data.count() #统计每列的非空值数 name 200 age 200 class 200 fares 200 dtype: int64 >>> data.describe() #统计每一列的基本信息 age class fares count 200.000000 200.000000 200.000000 mean 34.580000 2.025000 84.735000 std 8.599614 0.847328 53.714159 min 20.000000 1.000000 20.000000 25% 27.000000 1.000000 40.000000 50% 35.000000 2.000000 71.000000 75% 42.000000 3.000000 124.250000 max 49.000000 3.000000 199.000000 >>> data.rename(columns={'name':'new_name'}) #修改列名‘name’为‘new_name’ new_name age class fares 0 PFp 22 1 121 1 UtG 45 1 143 2 NWT 49 1 171 3 pHK 45 2 71 4 1AD 24 3 42 .. ... ... ... ... 195 BO6 29 1 165 196 Xcu 45 1 193 197 LPB 35 3 26 198 0kx 40 2 89 199 ulK 41 2 87 [200 rows x 4 columns] >>> data.drop(['age','fares'],axis=1) #删除'age'和'fares'列 name class 0 PFp 1 1 UtG 1 2 NWT 1 3 pHK 2 4 1AD 3 .. ... ... 195 BO6 1 196 Xcu 1 197 LPB 3 198 0kx 2 199 ulK 2 [200 rows x 2 columns] >>> data.sort_values('fares',ascending=False).head(5) #按fares降序排列 name age class fares 194 BTs 41 1 199 139 gC0 31 1 196 6 j8B 20 1 194 196 Xcu 45 1 193 36 KGj 39 1 193 >>> data.sort_values('fares',ascending=False).head(5).reset_index(drop=True) #排序后重设index name age class fares 0 BTs 41 1 199 1 gC0 31 1 196 2 j8B 20 1 194 3 Xcu 45 1 193 4 KGj 39 1 193 >>> data.pivot_table(index='class',values='fares',aggfunc='mean') #数据透视表,求各class的平均fares fares class 1 149.492754 2 72.982456 3 33.405405 >>> data.drop_duplicates(subset=['age','fares']) #按照age和fares去重,原先200行,现在196行 name age class fares 0 PFp 22 1 121 1 UtG 45 1 143 2 NWT 49 1 171 3 pHK 45 2 71 4 1AD 24 3 42 .. ... ... ... ... 195 BO6 29 1 165 196 Xcu 45 1 193 197 LPB 35 3 26 198 0kx 40 2 89 199 ulK 41 2 87 [196 rows x 4 columns] >>> data = pd.DataFrame({'first':pd.Series([10,20,None,40],index=list('abcd')),'second':pd.Series([100,None,300,None,500],index=list('bcdef'))}) >>> data first second a 10.0 NaN b 20.0 100.0 c NaN NaN d 40.0 300.0 e NaN NaN f NaN 500.0 >>> data.dropna(how='all') #删除空行 first second a 10.0 NaN b 20.0 100.0 d 40.0 300.0 f NaN 500.0 >>> data.dropna(subset=['second']) #如果’sencond‘列有缺失值,就删除该行 first second b 20.0 100.0 d 40.0 300.0 f NaN 500.0 >>> data.fillna(0) #给缺失值填充为0 first second a 10.0 0.0 b 20.0 100.0 c 0.0 0.0 d 40.0 300.0 e 0.0 0.0 f 0.0 500.0
- 参数subset指定哪些列中有重复数据时,删除行数据
- head()
-
列操作
- 类比字典操作,会修改源数据
- 获取列:data['列名']
- 增加列:data['新列名'] = 数据(列表,ndarray类型)
- 删除列:del data['列名']
>>> data = pd.DataFrame({"first":[1,2,3],"second":[4,5,6]},index=list('abc')) >>> data['first'] #获取'first'列 a 1 b 2 c 3 Name: first, dtype: int64 >>> data['third'] = [10,20,30] #增加third列 >>> data first second third a 1 4 10 b 2 5 20 c 3 6 30 >>> del data['first'] #删除'first'列 >>> data second third a 4 10 b 5 20 c 6 30
-
索引和切片
- data[切片]
- 如果传入的是整数切片,则按照下标进行切片,如果是非整数,则按照键进行切片
- data['列名']
- 列索引,获取列数据
- data[['列1‘,'列2'...]]
- 列索引,获取多列数据
- data.loc[index]
- 获取指定行数据
- data.loc[[index1,index2...]]
- 获取指定多行数据
- data.loc[键切片]
- 获取指定键范围内的行数据,按照键切片
- data.loc[index,'列名']
- 直接根据行和列索引定位某个数据
- data.loc[index,['列1','列2'...]]
- 获取指定行的部分列数据
- data.loc[[index1,index2...],['列1','列2'...]]
- 获取指定多行的部分列数据
- data.loc[键切片,['列1','列2'...]]
- 获取指定键范围内行的部分列数据
- data.loc[行切片,列切片]
- 获取指定范围内的数据(连续的一个区域)
- data.iloc[下标]
- 按照下标获取指定行数据
- data.iloc[下标切片]
- 按照下标切片获取指定范围内行数据
>>> data first second a 1 4 b 2 5 c 3 6 >>> data['a':'c'] #按键切片 first second a 1 4 b 2 5 c 3 6 >>> data[0:2] #按下标切片 first second a 1 4 b 2 5 >>> data.loc['a'] #取键索引为'a'行数据 first 1 second 4 Name: a, dtype: int64 >>> data.loc[['a','c']] #取键索引为'a'和'c'行数据 first second a 1 4 c 3 6 >>> data.iloc[1] #取下标为1的行数据,即第2行 first 2 second 5 Name: b, dtype: int64 >>> data.iloc[[1,2]] #取下标为2和3的行数据,即第3-4行 first second b 2 5 c 3 6 >>> data.loc['b','first'] #定位键索引'b'行'first'列数据 2 >>> data.loc[['b','c'],'first'] #'c'和'c'行‘first’列数据 b 2 c 3 Name: first, dtype: int64 >>> data.loc['b':'c','first'] #行使用切片 b 2 c 3 Name: first, dtype: int64 >>> data.loc['b':'c','first':'second'] #行和列均使用切片 first second b 2 5 c 3 6 >>> data.loc['b':'c',['first','second']] #获取多行多列数据 first second b 2 5 c 3 6
- 按照下标切片获取指定范围内行数据
- data[切片]
-
数据过滤
- data[条件] - 根据指定条件对数据进行过滤
>>> data[data['second']%2==0] #获取'second'列值为偶数的行数据 first second a 1 4 c 3 6 >>> data[data['first']<3] #获取'first'列值小于3的行数据 first second a 1 4 b 2 5
- data[条件] - 根据指定条件对数据进行过滤