一个运行速度非常快的数学库,主要用于数组计算
一个强大的“分析结构化数据”的工具集,底层依赖numpy
用于数据挖掘和数据分析,同时也提供数据清洗功能
pandas主要有两种数据结构:Series和Dataframe
Series 类似于一维数组,主要用于表示某行或者某列
Dataframe是pandas中一种表格型的数据结构
一个功能强大的数据可视化开源工具
python中使用最多的图形绘图库
一个python数据可视化开源库,建立在Matplotlib之上
基于python语言的机器学习工具,主要用于数据挖掘和数据分析
是进行数据分析学习和开发的首选开发环境
numpy是python数据分析必不可少的第三方库
numpy的数组类被称为ndarray,通常被称作数组
ndarray的属性有:
ndarray.ndim? 数组是几维的
ndarry.shape? 数组有几行几列
ndarray.size? ?数组中的元素个数
ndarray.dtype? 数组中的元素类型
ndarray.itemsize? 数组中每个元素的字节大小
运行代码
方式1:a=np.array([1,2,3,4,5])
方式2: a=ones((2,3)) /a=zeros((2,3))? 创建全是1的数组或者全是0的数组
方式3: a=np.arange(10,20,2,dtype=int)? 创建起点为10,终点为20,步长为2,数据类型为int的数组
以下的范围都是包左不包右
arr1=np.random.rand(2,3)? ?生成一个二行三列的数组,每个元素都是从0到1的小数
arr2=np.random.randint(1,5,size=(2,3))? 生成一个二行三列的数组,每个元素都是从1到5的整数
arr3=np.random.uniform(1,5,size=(2,3))? 生成一个二行三列的数组,每个元素都是从1到5的小数
matrix函数用于创建二维数组
arr1=np.mat('1 2;3 4')
arr2=np.matrix('1,2;3,4')
arr3=np.matrix([[1,2,3],[4,5,6]])
arr1=np.logspace(1,3,5)? #创建从10到1000的等比数列,元素个数为5个
arr2=np.logspace(1,2,5,base=3,endpoint=True)#创建从3到9的等比数列,元素个数为5个并且包含9
arr1=np.linspace(1,5,3,endpoint=False) #创建从1到5的等差数组,不包含5,元素个数为3
dtype? 指定数据的类型
astype 转化数据的类型
arr1=np.array([1.2,1.3,1.4],dtype=np.float32)
arr2=arr1.astype(np.int32)
np.ceil()? 向上取整
np.floor()? 向下取整
np.rint()? 四舍五入
np.isnan() 判断元素是否为NAN
np.mutiply() 元素相乘
np.divide()? 元素相除
np.abs()? 求元素的绝对值
np.where(condition,x,y)? 三元运算符,条件成立取x,不成立取y
np.mean() 求平均值
np.sum() 求和
np.max() 求最大值
np.min()求最小值
np.argmax()最大值的下标索引
np.argmin()最小值的下标索引
np.cumsum()累加和
np.cumprod()累乘积
arr1=np.array([-1,2,3])
print(arr.any(arr1>0)) #任意一个值大于0返回True
print(arr.all(arr1>0))#所有值大于0返回True
arr1=np.array([1,2,3],[2,3,4])
print(np.unique(arr1))
arr1=np.array([1,3,2,5])
arr2=np.sort(arr1) #对数组排序,返回新的数组
arr1.sort()#直接在原数据上修改
arr1=np.array([[1,2,3],[4,5,6]])
arr2=np.array([[1,2,3],[4,5,6]])
print(arr1-arr2)
print(np.multiply(a,b))
#当两个矩阵行数和列数相反时
a.dot(b)
np.dot(a,b)
Dataframe和Series是pandas的两种最基本的数据结构
创建一个10到101,步长为10的series对象
Series=pd.Series(list(range(10,101,10)))
series的常用属性有:
series.loc[:5]? ?根据索引获取前5条内容,包左包右
series.iloc[:5]? 根据索引获取前5条内容,包左不包右
series.dtype? ?series中每个元素的类型
series.shape? ?series的维度
series.size? ? ? series的元素个数
series.values? ?series中的所有元素值
series的常用方法有:
s1.mean()? ? 平均值
s1.sum()? ? ? ?求和
s1.max()? ? ? ?最大值
s1.min()? ? ? ? 最小值
s1.std()? ? ? ? ?标准差
s1.count()? ? 求个数
series还可以和布尔值数组结合一起使用
s1=pd.Series([1,2,3])
flag=[True,False,True]
s1[flag]? 将True对应的元素留下,将False对应的元素删除
series的计算
series+数值,将series中的每个数值,依次和要加的数值进行计算
series*数值? ? 将series中的每个数值,依次和要乘的数值进行计算
series1+series2? ?将两个series进行计算,会根据对应的索引进行匹配,未匹配的数据用NAN填充
df.shape? ? 查看df的行,列
df.size? ? ? ?df中的元素个数,即行*列的结果
df.nim? ? ? 产看df对象的维度
df.index? ? 查看所有的索引值
df.columns? ?查看所有的列名
len(df)? 查看df对象的行数
df.max()? 返回每列的最大值
df.min()? ?返回每列的最小值
df.mean()? 计算数字列的平均值
df.info()? 查看df对象的信息
df.count()? 查看非空值个数
df.describe()? 查看df对象的详细信息
df也支持通过布尔索引来获取元素
print(df.head(3)[[True,False,True]])? ?获取df对象前三条数据中的第一条和第三条
df对象的运算是通过对应索引来进行的,不匹配的使用nan填充
df1+df1
df1+df1[:3]? df1的前三条数据相加,后面的数据使用nan填充
df1.set_index('id',inplace=True)#为df设置索引列,inplace=True表示在原数据上修改
df=pd.read_csv("data",index_col='id')#读取数据的时候,直接设置索引列
df1.reset_index()? #重置索引列
df1.rename(index={ 1:'A' },colmuns={ 'name': ' 姓名 '})? #使用rename函数修改df的索引和列名
df[ 'new_col']=value? ?#新增一列
df.drop('列名',axis=1/columns)? ?#删除列名
df.insert(loc=列号,column='列名',value='设置的值'?)? #向指定位置插入一列
df=pd.read_csv('文件路径') #导入数据
df1.head(3).to_csv('文件路径') #导出数据
df['列名']? ?#获取某列数据
df[['列名1','列名2','列名3']] #获取多列数据
df.head(n=3)? #获取前三行数据
df.tail(n=3) #获取后三行数据
df.loc[1]? #根据行索引,获取指定行的数据
df.loc[[1,3,5]] #根据行索引,获取指定多行的数据
df.iloc[1]? #获取行号为1的数据
df.iloc[1,3,5] #获取行号为1,3,5的数据
df.loc[[101,103],['name','age']] #获取指定行指定列的数据
df.iloc[[2,3],[1,2]] #获取指定行,指定列的数据
df.loc[:,['列名1','列名2']]? #获取所有行的指定列的数据
df.iloc[:,[1,-1]] #获取所有行的第二列和最后一列数据
df.iloc[:,list(range(0,2))] #通过range生成列的编号,然后获取所有行对应的列
df.loc[:]? ?包左包右
df.iloc[:]? ?包左不包右
df.groupby('gender')['name'].count()? ? #统计男女总人数
df.groupby('gender')['age'].mean()? ?#统计男女平均年龄
df.groupby(['address','gender'])['age'].count() #统计各地区男女总人数
#获取最大的n个? ?df.nlargest(n,'列名')
#获取最小的n个? ?df.nlargest(n,'列名')
#按照某列数据进行排列? ? df.sort_values('age',ascending=False)
#按照列一升序,列一的值一致,按照列二降序排列? ? df.sort_values(['列1','列2'],ascending=['True','False'])
#去重后排序? ?df.drop_duplicates('age')
stus=pd.concat([df1,df2])#根据行进行拼接
stus=pd.concat([df1,df2],ignore_index=True) #根据行进行拼接,并且重置索引
stus=df1.append(df2) #如果只是两个df拼接,使用append即可
res_cols=pd.concat([df1,df2],axis=1)? #对两个df对象进行列拼接
df.merge(kf,how='left',on='kongfu_id')? #左表的全集+交集
df.merge(kf,how='right',on='kongfu_id') #右表的全集+交集
df.merge(kf,how='inner',on='kongfu_id')#左表和右表的交集
df.merge(kf,how='outer',on='kongfu_id')#左表的全集+右表的全集
Numpy中缺失值有几种表示形式:NaN,NAN,nan,它们都一样
NaN不等于0也不等于空串
df.dropna(how='any',axis=0,inplace=True) #只要某一行有缺失值,就删除该行
df.dropna(how='any')#只要某一列有缺失值,就删除该列
df.fillna(0,inplace=True)
df.fillna(method='ffill',inplace=True)#使用空值的上一个值填充
df.fillna(method='bfill',inplace=True)#使用空值的下一个值填充
s1=pd.Series([1,2,3])
def? my_func(x):
? ? ? return? ?x*3
s2=s1.apply(my_func)
如果函数有多个参数,在调用时需要传参
def? my_func(x,e):
? ? ? ?return? ?x*e
s2=s1.apply(my_func,e=5)
df=pd.DataFrame({ 'col1':[1,2,3],'col2':[4,5,6] })
def? my_func_col(col):? ? #传入的是列
? ? ? ? ?x=col[1]
? ? ? ? ?y=col[2]
? ? ? ? ?z=col[3]
return? x+y+z
df.apply(my_func_col,axis=0)
def? my_func_row(row): #传入的是行
? ? ? ? ?x=row[1]
? ? ? ? ?y=row[2]
return? x+y
df.apply(my_func_row,axis=1)
函数向量化? ? @np.vectorize? def? func1():? ? xxxxxx
lambda 函数? ? 当函数体比较简单,只有一句话的时候,可以使用lambda函数
df.apply(lambda x? : x*3 )
分组聚合
df1.groupby('gender')['age'].mean()
分组转化
@np.vectorize
def? myfunc(x):? ? #定义转化函数
? ? if x>30:
? ? ? return? '年龄超过30岁了'
? ?return? '年龄没有超过30岁'
df['new_col']=df.groupby('age').age.transform(myfunc)
分组过滤
df.groupby('id').fillter(lambda x :? x.age>20)
#统计各个地区男女总数
df.groupby([address,gender],as_index=False).id.count()
#使用透视表也可以得到相同的结果
df.pivolt(index='address',columns='gender',values='id',aggfunc='count',margins=True)