文章目录
在pandas中有两类非常重要的数据结构,即序列Series和数据框DataFrame。Series类似于numpy中的一维数组,除了通吃一维数组可用的函数或方法,而且其可通过索引标签的方式获取数据,还具有索引的自动对齐功能;DataFrame类似于numpy中的二维数组,同样可以通用numpy数组的函数和方法
import numpy as np, pandas as pd
数据索引
通过索引值或索引标签获取数据
s4 = pd.Series(np.array([1,1,2,3,5,8]))
print(s4)
print(s4.index)
RangeIndex(start=0, stop=6, step=1)
s4.index = ['a','b','c','d','e','f']
print(s4)
a 1
b 1
c 2
d 3
e 5
f 8
dtype: int64
自动化对齐
s5 = pd.Series(np.array([10,15,20,30,55,80]),index = ['a','b','c','d','e','f'])
print(s5)
s6 = pd.Series(np.array([12,11,13,15,14,16]),index = ['a','c','g','b','d','f'])
print(s6)
print(s5 + s6)
a 22.0
b 30.0
c 31.0
d 44.0
e NaN
f 96.0
g NaN
dtype: float64
由于s5中没有对应的g索引,s6中没有对应的e索引,所以数据的运算会产生两个缺失值NaN
利用pandas查询数据
#查询数据的前5行或末尾5行
student.head()
student.tail()
#查询指定的行
student.loc[[0,2,4,5,7]]
#查询指定的列,多个列的话,必须使用双重中括号
student[['Name','Height','Weight']].head()
student.loc[:,['Name','Height','Weight']].head()
#查询出所有12岁以上的女生信息
student[(student['Sex']=='F') & (student['Age']>12)]
#查询出所有12岁以上的女生姓名、身高和体重
student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]
利用pandas的DataFrames进行统计分析
pandas模块为我们提供了非常多的描述性统计分析的指标函数,如总和、均值、最小值、最大值等
print('非空元素计算: ', d1.count()) #非空元素计算
print('最小值: ', d1.min()) #最小值
print('最大值: ', d1.max()) #最大值
print('最小值的位置: ', d1.idxmin()) #最小值的位置,类似于R中的which.min函数
print('最大值的位置: ', d1.idxmax()) #最大值的位置,类似于R中的which.max函数
print('10%分位数: ', d1.quantile(0.1)) #10%分位数
print('求和: ', d1.sum()) #求和
print('均值: ', d1.mean()) #均值
print('中位数: ', d1.median()) #中位数
print('众数: ', d1.mode()) #众数
print('方差: ', d1.var()) #方差
print('标准差: ', d1.std()) #标准差
print('平均绝对偏差: ', d1.mad()) #平均绝对偏差
print('偏度: ', d1.skew()) #偏度
print('峰度: ', d1.kurt()) #峰度
print('描述性统计指标: ', d1.describe()) #一次性输出多个描述性统计指标
自定义一个函数,将这些统计描述指标全部汇总到一起
def stats(x):
return pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(.25),x.median(),x.quantile(.75),
x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),x.std(),x.skew(),x.kurt()],
index = ['Count','Min','Whicn_Min','Q1','Median','Q3','Mean','Max',
'Which_Max','Mad','Var','Std','Skew','Kurt'])
df = pd.DataFrame(np.array([d1,d2,d3]).T,columns=['x1','x2','x3'])
print(df.head())
print(df.apply(stats))
实现SQL操作
在SQL中常见的操作主要是增、删、改、查几个动作
增:添加新行或增加新列
pd.concat([student,student2])
pd.DataFrame(student2, columns=['Age','Height','Name','Sex','Weight','Score']))
新增的列没有赋值,就会出现空NaN的形式
删:删除表、观测行或变量列
#删除数据框student2
del student2
#删除指定的行
student.drop([0,1,3,6])
#根据布尔索引删除行数据
student[student['Age']>14]
#删除指定的列
student.drop(['Height','Weight'],axis=1)
改:修改原始记录的值
student3.loc[student3['Name'] == 'LiuShunxiang','Height']=173
print(student3[student3['Name'] == 'LiuShunxiang'][['Name','Height']])
聚合:groupby()函数实现数据的聚合操作
student.groupby('Sex').mean()
student.groupby(['Sex','Age']).mean()
排序
Data.sort_index()
student.sort_values(by = ['Age','Height'])
多表连接
merge函数实现的是两个表之间的内连接,即返回两张表中共同部分的数据。可以通过how参数设置连接的方式,left为左连接;right为右连接;outer为外连接
pd.merge(student, score, on='Name')
pd.merge(student, score, on='Name', how='left')
缺失值的处理
现实生活中的数据是非常杂乱的,其中缺失值也是非常常见的,对于缺失值的存在可能会影响到后期的数据分析或挖掘工作
- 删除法:当数据中的某个变量大部分值都是缺失值,可以考虑删除改变量;当缺失值是随机分布的,且缺失的数量并不是很多是,也可以删除这些缺失的观测。
- 替补法:对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;如果变量是有偏的,可以使用中位数来代替那些缺失值;对于离散型变量,我们一般用众数去替换那些存在缺失的观测。 替补法:对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;如果变量是有偏的,可以使用中位数来代替那些缺失值;对于离散型变量,我们一般用众数去替换那些存在缺失的观测。
- 插补法:插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。插补法:插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。
删除
#num函数和isnull函数来检测数据中含有多少缺失值
print(sum(pd.isnull(s)))
#删除缺失值,要含有缺失值NaN,该数据行就会被删除
s.dropna()
填补
#0填补所有缺失值
df.fillna(0)
#采用前项填充或后向填充
print(df.fillna(method='ffill'))
print(df.fillna(method='bfill'))
#使用常量填充不同的列
print(df.fillna({'x1':1,'x2':2,'x3':3}))
Excel的数据透视表功能
多层索引的使用
s = pd.Series(np.arange(1,10),index=[["a","a","a","b","b","c","c","d","d"],[1,2,3,1,2,3,1,2,3]])
#选取外层索引为a的数据
print(s['a'])
#选取外层索引为a和内层索引为1的数据
print(s['a',1])
#选取外层索引为a和内层索引为1,3的数据
print(s['a'][[1,3]])
#层次化索引的切片,包括右端的索引
print(s[['a','c']])
print(s['b':'d'])
#通过unstack方法可以将Series变成一个DataFrame
#数据的类型以及数据的输出结构都变成了DataFrame,对于不存在的位置使用NaN填充
print(s.unstack())
https://tianchi.aliyun.com/notebook/detail.html?spm=5176.11510288.0.0.42dcb7bd0xCrmI&id=6068