pandas
三大对象
1.DataFrame(index, columns ,values)
1)先从文件(excel,csv,mysql)中读取,或者自己制造一个DataFrame对象
2)查看数据
查看数据的形状(几行几列)
查看每一列的数据类型,数据中是否有空值(行、列),查看每一列和标签的关系(离散-柱状图,连续-密度图或者子状图),两列之间的相关度,查看整个的数据分布(最小,最大,均值,标准差等)目的之一是找出异常值。
3)清洗数据
删除
列(如序号列)、行、空值的列(如:一列中绝大多少是空值)
替换
空值(一列中极少数空值,替换方法许多,如均值(连续型如年龄),众数(离散型,如性别),线性差值等),去掉空格/特殊字符,数据类型转换,列名,索引名
4)整理
排序:列的值,索引
修改结构:列变成索引
分组:索引,列
注意:分组要做数据统计 (透视表-pivot-table、 交叉表)
应用函数
列
5)数据合并
多个DateFrame 按照不同的轴合并
6)数据统计
count,sum,max,min mean
7)可视化
使用:
导入: import pandas as pd
1.数据类型
1)Series:index(行索引)+values(1维numpy数据)
2)DataFrame:index(行索引)+Columns+values(2维numpy数据)
2.读入/写入数据
1)手动创建(内存)
df = pd.DataFrame(2维列表/2维numpy数组/字典,index =1维列表/数组 ,columns =1维列表/数组 )
2)从文件读取(csv--以逗号分隔的文本、excel、json、xml、html等)
df = pd.read_csv('csv文件',sep=‘,’ , encoding ='utf-8/gbk',header= True/False)
3)从数据库中读取
4)写入文件/数据库
df.to_csv('csv文件',header= True, index= False)
3.查看数据
1)查看数据的形状(几行几列)
df.shape
2)查看数据列的数据类型和空值
df.info()
df.isnull.sum(axis=0/1)/df.shape[0/1]
3)查看数据的前5行和后5行
df.head()、df.head(n)
df.tail()、df.tail(n)
4)查看统计信息
df.describe(include = 'all')
5)查看某列的唯一性(unique)
s.unique()
s.value_counts() #可以用于计数
如:
df.年龄.value_counts()
df['年龄'].value_counts()
柱状图显示结果:
import matplotlib.pyplot as plt
df['年龄'].value_counts().plot(kind='bar')
plt.show()
4.选择数据
方法1:
获取行 df[切片/全部行的布尔数组]
如: df[1:4] #获取第2,3,4 三条数据
df[[False,True,True,True,False,False]]
df[df.age>15 ] #以上两条含义一致,更多选择下一条
获取列
df[列名] 或df.列名, df[列表]
方法2
获取行/列 df.iloc[行自动索引切片,列自动索引切片]
df.loc[行手动索引切片,列手动索引切片]
df.loc[:,'性别']
df.loc[:,['性别','年龄']]
df.iloc[1:4:]
增加列 df[不存在的列] = 值
增加行 df.iloc[6]=['wangwu',20,'Y'] #报错
df.loc[3]=['wangwu',20,'Y'] #已知道有多少行
len(df) #用于测试一共有多少行
改进:df.loc[len(df)]=['wangwu1',20,'Y']
相关代码:
import pandas as pd df = pd.DataFrame( [ ['zhangsan',18,'Y'], ['lisi',19,'N'], ['wangwu',20,'Y'] ],index=['a','b','c'],columns=['姓名','年龄','是否结婚']) df df.index,df.columns,df.valuse df = pd.read_csv('1.txt') df df.to_csv('2.txt',header= True) df.年龄, type(df.年龄) df.to_csv('3.txt',index = False) df.shape df.info() df.tail() df.tail(2) df.describe() df.describe(include = 'all') df.年龄.unique df.年龄.value_counts() df['年龄'].value_counts() import matplotlib.pyplot as plt df['年龄'].value_counts().plot(kind='bar') plt.show() df.loc[3]=['wangwu',20,'Y'] df.loc[len(df)]=['wangwu1',20,'Y'] df
5.清洗数据
1)删除
drop(行/列/列的列表---格式是字符串/整数/列表 , axis = 0/1)
dropna:删除含有空值 的列和行,很少用。
注意:大部分删除的列,1)感觉没有用的列,通常是id,name这些列。2)空值太多的列 3)没用的列-通过特征工程比如方差为0,过滤法F减压
df.drop('姓名',axis=1) 结果变,df没有变,如果变,两种办法,1)把结果赋值给df,2)把参数加入inplace=True
#删除空值的列 #先查看所有列的空值 df.info() #结果不是统计数据,不方便 df.isnull() #是空值才为True df.isnull().sum(axis = 0) #沿着轴0进行累加空值数 df.isnull().sum(axis = 0)/ df.shape[0] #沿着轴0得到空值的比例数
#删除空值的行
#先查看所有行的空值
df.isnull().sum(axis = 1)/ df.shape[1] #沿着轴1得到空值的比例数
df.drop(3,axis = 0) #删除第三行
df.isnull().sum(axis = 1)/ df.shape[1]<0.8 #找出空值数比例在0.8以下的列
df2 = df[(df.isnull().sum(axis = 1)/ df.shape[1]<0.8)] #选择满足该比例的数据列
2)替换
s.fillna(值):空值替换
s.replace(old_value, new_value):非空值替换
举例:
df.是否结婚.replace ('Y',0)
#连续型的用均值
#离散型的用众数
df.是否结婚.mode()[0]
df.是否结婚 = df.是否结婚.fillna(df.是否结婚.mode()[0])
3)数据类型转换
astype
pd_todatetime(要改变的字符串, format = 格式) #字符串格式良好,则不用写format
举例:
查看类型:dy.dtypes
df.年龄.astype(float)
4)修改列名
df.rename(old_name,new_name)
5)apply 函数
apply(lambda x:处理x)
6)排序
sort_value
sort_index
df.sort_value('年龄',axis=0,ascendinig = True) #从小到大, 若要从大到小,改为False
df.sort_value(['年龄','性别'], axis=0,[ascendinig = True,ascending = False]) #从小到大, 若要从大到小,改为False
6。数据整理
1)连接
拼接: pd.concat((df1,df2),axis=0/1)
连接:pd.merge(左边,右边,on = 关键字,how = ‘inner/left/right’)
2)分组
set_index
reset_index
stack
unstack
groupby
3)透视表
pivot_table(哪几列数据,)
df.pivot_table(value='价格',index =‘产地’,columns= '类别',aggfunc='mean').fillna(0)
4)交叉表(把一列作为)用于统计分组频率的特殊透视表,
crosstab
5)统计
4.查看数据分布
2.Series
3.Panel