python,pandas,numpy内容回顾
pandas基础
1.数据结构Series和Dataframe
Series类似numpy中的一维数组可调用一维数组的函数与方法DataFrame为多维数组,同样可运用numpy的函数和方法(注:识别数据结构的类型,是Series还是DataFrame很关键)
ar = np.arange(5) #创建一维数组
print(type(ar)) output: <class 'numpy.ndarray'>
ser = pd.Series(ar) #创建一维序列Series
print(type(ser)) pandas.core.series.Series
df1 = pd.DataFrame(ar) #创建数据框DataFrame
print(type(df)) pandas.core.frame.DataFrame
通过多维数组创建DataFrame
arr2 = np.array(np.arange(12)).reshape(4,3)
df1 = pd.DataFrame(arr2)
通过字典创建DataFrame
dic = {'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12],'d':[13,14,15,16]}
df = pd.DataFrame(dic)
通过DataFrame创建DataFrame
df2 = df[["a","c"]]
2.数据索引行index与列columns
通过索引标签(行)获取数据
df[["a","c"]]
如果是索引列的话用columns
df.columns[0:5]
3.查询数据
数据集
Age Height Name Sex Weight
0 14 69.0 Alfred M 112.5
1 13 56.5 Alice F 84.0
2 13 65.3 Barbara F 98.0
3 14 62.8 Carol F 102.5
4 14 63.5 Henry M 102.5
查询指定的行
df.loc[[0,2,4,5,7]] #行号索引
查询指定的列(无列名)
df.columns[0:3]
查询指定的列(有列名)
student[['Name','Height','Weight']]
通过loc索引标签查询指定的列
student.loc[:,['Name','Height','Weight']] #loc为轴索引
student.iloc[0:5,1:3] #iloc为数字索引
查询出所有12岁以上的女生信息
student[(student['Sex']=='F') & (student['Age']>12)]
查询出所有12岁以上的女生姓名、身高和体重
student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]
4.利用pandas的DataFrames进行统计分析
np.random.seed(1234)
d1 = pd.Series(2*np.random.normal(size = 100)+3)
d2 = np.random.f(2,4,size = 100)
d3 = np.random.randint(1,100,size = 100)
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()) #一次性输出多个描述性统计指标
5.利用pandas实现SQL操作
增:添加新行或增加新列
student3 = pd.concat([student,student2]) #使两个数据框上下粘结在一起
删:删除制定列
student.drop(['Height','Weight'],axis=1)
根据布尔索引删除行数据
student[student['Age']>14]
查和改已经介绍过
聚合: #聚合完数据类型仍为DataFrames
pandas模块中可以通过groupby()函数实现数据的聚合操作
student.groupby('Sex').mean()
聚合过程中对原始数据进行限制
student.drop('Age',axis=1).groupby('Sex').mean()
对多个分组变量进行聚合
student.groupby(['Sex','Age']).mean()
对每个分组进行多个统计量计算
student.drop('Age',axis=1).groupby('Sex').agg([np.mean,np.median])
排序:
使用sort_index和sort_values实现序列和数据框的排序
Data.sort_index()
Data.sort_values(ascending=False)
多表链接 merge
pd.merge(student, score, on='Name') #student与score均为Dataframes数据类型.
注意,默认情况下,merge函数实现的是两个表之间的内连接,即返回两张表中共同部分的数据。可以通过how参数设置连接的方式,left为左连接;right为右连接;outer为外连接。
6. 利用pandas进行缺失值的处理
删除法:
s.dropna()
替补法:对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;如果变量是有偏的,可以使用中位数来代替那些缺失值;对于离散型变量,我们一般用众数去替换那些存在缺失的观测。
print(df.fillna(method='ffill')) # 前项填充
print(df.fillna(method='bfill'))# 后项填充
df["x1"].fillna(df['x1'].median()) #中位数填充
插补法:插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。(后续补充)
7. 利用pandas实现Excel的数据透视表功能
pivot_table(data,values=None,
index=None,
columns=None,
aggfunc='mean',
fill_value=None,
margins=False,
dropna=True,
margins_name='All')
data:需要进行数据透视表操作的数据框
values:指定需要聚合的字段
index:指定某些原始变量作为行索引
columns:指定哪些离散的分组变量
aggfunc:指定相应的聚合函数
fill_value:使用一个常数替代缺失值,默认不替换
margins:是否进行行或列的汇总,默认不汇总
dropna:默认所有观测为缺失的列
margins_name:默认行汇总或列汇总的名称为'All'
针对如下DataFrames
#一个分组变量Sex一个数值变量Height
Table1 = pd.pivot_table(student, values=['Height'], columns=['Sex'])
print(Table1)
Sex F M
Height 60.588889 63.91
#一个分组变量(Sex),两个数值变量(Height,Weight)
Table2 = pd.pivot_table(student, values=['Height','Weight'], columns=['Sex'])
print(Table2)
Sex F M
Height 60.588889 63.91
Weight 90.111111 108.95
#两个分组变量(Sex,Age),两个数值变量(Height,Weight)
Table4 = pd.pivot_table(student, values=['Height','Weight'], columns=['Sex','Age']).unstack()
print(Table4)
Age 11 12 13 14 15 16
Sex
Height F 51.3 58.050000 60.9 63.55 64.50 NaN
M 57.5 60.366667 62.5 66.25 66.75 72.0
Weight F 50.5 80.750000 91.0 96.25 112.25 NaN
M 85.0 103.500000 84.0 107.50 122.50 150.0
#使用多个聚合函数
Table5 = pd.pivot_table(student, values=['Height','Weight'], columns=['Sex'],aggfunc=[np.mean,np.median,np.std])
print(Table5)
mean median std
Sex F M F M F M
Height 60.588889 63.91 62.5 64.15 5.018328 4.937937
Weight 90.111111 108.95 90.0 107.25 19.383914 22.727186
8. 多层索引的使用
pandas可以帮我们实现用低维度形式处理高维数数据
#Series的层次化索引,索引是一个二维数组,相当于两个索引决定一个值
#有点类似于DataFrame的行索引和列索引
以下为Series 的多层索引
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]])
print(s) #内层索引为abcd,外层为123
a 1 1
2 2
3 3
b 1 4
2 5
c 3 6
1 7
d 2 8
3 9
dtype: int64
print(s.index)
MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]],
labels=[[0, 0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 2]]) #多层索引
#选取外层索引为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())
1 1
2 2
3 3
dtype: int64
1
1 1
3 3
dtype: int64
a 1 1
2 2
3 3
c 3 6
1 7
dtype: int64
b 1 4
2 5
c 3 6
1 7
d 2 8
3 9
dtype: int64
1 2 3
a 1.0 2.0 3.0
b 4.0 5.0 NaN
c 7.0 NaN 6.0
d NaN 8.0 9.0
参考链接:
pandas官方文档
阿里天池pandas基础