python数据分析——pandas的应用

导入库:

import pandas as pd

构建一个空的数据框:

data=pd.DateFrame()

根据自己编写的数据构造数据框:

'''将键作为列名'''
raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons', 'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'], 
        'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'], 
        'name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
        'preTestScore': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3],
        'postTestScore': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 70]}
data= pd.DataFrame(raw_data, columns = raw_data.keys())
========================分割=======================
'''将键作为索引'''
a={'a':1,,'b':2,'c':3,'d':4,'t':5}
#或者
a={'a':[1,2,3],'b':[3,4,5],'c':[5,6,7],'d':[7,8,9],'t':[0,0,0]}
data=pd.DataFrame.from_dict(a,orient='index')
'''这里的orient是指定让键当做索引'''

自己构造数据时,字典里面的键是字段名(列名),值是每一列的数据,数值一定要添加“[]”符号
  
读取csv、tsv文件:

data=pd.read_csv(fliename,sep='分隔符')#filename是字符串,分隔符比如制表符’\t‘或者逗号

pd.read_cav(table)中的参数parse_dates用于指定哪几列为时间索引:
比如,前三列分别表示年月日,使用该参数后,得到的数据框的第一列是原来的三列的组合。

data=pd.read_csv(filename,sep='\s+',parse_dates=[[0,1,2]])

在这里插入图片描述
在这里插入图片描述

查看数据表的前几行数据:

data.head(数字)  #默认情况下是前五行

查看数据表的相关大小信息:

data.info()

查看表的行列数:

data.shape[0]len(data)

查看表的字段名(列名):

 data.columns

修改字段名,或者是有些表没有表头,列名用1.2.3.4代替的,此时给各列一个字段名

data.rename(columns={0:'字段1',1:'字段2'2:'字段3'})
#或者
date.rename(columns={'原字段名':'新字段名'},inplace=True)

查看某一列数据的数据类型,

data.列名.dtype

查看所有列的数据类型:

data.dtypes

查看某一列的最大(小)值:

data.列名.max()
data.列名.min()

查看指定字段出现最大值的列号:

data.列名.idimax()

如果给原有的数据表添加一列,比如是数据表格式的字段名为name的一列,只需要

data[name]=name不能用data.name=name

读取user文件:

data=pd.read_table(filename,sep='分隔符',index_col=' 某个列名')#这里的index_可以是某个列名(字符串),也可以是列号如index_col=[0]或[1]……

计算列的唯一值(不要被“唯一”误导,其实就是查看列里面都有哪些不同的值),

data.列名.unique()

查看列的唯一值的个数:

data.列名.nunique()

查看数据表的统计信息用的describe()方法,默认不加参数的情况下,仅统计数据类型为数值型数据的列,若要统计所有的列,需要加上参数,即

data.describe(include='all')

指定查看某一列的统计信息:

data.列名.describe()

查看某一列的列名:

data.columns[指定的列号]

查看指定列号n列的数据类型(不知该列的名称):data.dtypes[n-1],如果已知列名data.dtyes[列名]或者data[列名].dtype
查看指定位置(如第10行第5列)的数据:data.values[9][4]
删除行列的方法DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
  labels 就是要删除的行列的名字,用列表给定
  axis 默认为0,指删除行,因此删除columns时要指定axis=1;
  index 直接指定要删除的行
  columns 直接指定要删除的列
  inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe;
  inplace=True,则会直接在原数据上进行删除操作,删除后无法返回。

删除指定列:

data.drop(columns=列名,axis=1)这里一定要指明axis=1,否则删除的是行
或者
del data['列名']

删除多列:

data.drop(columns=[1,列2……列n],axis=1)

删除指定行:

data.drop(index=行号,axis=0)

删除缺失数据(dropna方法):

data.dropna(axis=0, how='any',  inplace=False)
axis=0表示删除这一行,how默认值为any,还可以取值all,前者表示只要这一行存在缺失值就删除,后者表示清楚全是缺失值的行,inplace表示是否就地更改

对指定的列取出重复元素:data.drop_duplicates(subset=[列1,列2……])不指定subset参数的情况下默认为对所有列去重
对某一列进行排序:

data.列名.sort_values()`或者`data.sort_values(by=列名)

取数据表中的指定几列数据组成新的数据表:newdata=data[[列1名,列2名……列n名]]
排序:首先按照第一种指标排序,然后按照第二种指标排序:

data.sort_values(by=[指标1,指标2])

查找某一列(字符串类型)以某个字符开头的记录:

data[data.列名.str.startwith('指定字符')]

查找指定列:data.iloc[行范围,列范围],其中行或者列的范围如果是连续的,就不用加[],直接用“:”符号,如果不连续,则需要用"[]"符号,在中括号内部注明需要选取的行号列号
根据列名搜索指定列:不能用iloc函数,而应该用ix函数,data.ix[行范围,列范围],,其中列范围是用[]包含的几个列的名字
loc方法,ix方法 iloc方法有区别于相似之处,注意使用
没有行索引的情况下,搜索指定行举例data.ix[data.Team.isin(['England', 'Italy', 'Russia']),['Team','Shooting Accuracy']]或者data.loc[data.Team.isin(['England', 'Italy', 'Russia']), ['Team','Shooting Accuracy']],这两种方法,第二种更正规,其中,Team是一个列名,isin()方法用于判断[‘England’, ‘Italy’, ‘Russia’]这第三个元素是否在这一列中,由于列Team不是索引列,因此必须通过这种方法挑出指定行。
iloc用于行列范围都是数字,loc用于行列范围都是字符,ix用于一个字符一个数字
给定一个字典(raw_data)的情况下,构造数据框:

#已知一个字典的名字为raw_data
df=pd.DataFrame(raw_data,columns=[各个列名])#columns也可以不指定

设置索引

将某一列设置为索引:

data.set_index('列名',drop=True)#drop默认情况下是True,意思是将这一列设为索引的情况下,将不再正表中出现,如果是False,则这一列会出现两次,索引列和正表中都会出现

python数据分析——pandas的应用_第1张图片
python数据分析——pandas的应用_第2张图片
  在已经设置某一列为索引的情况下,设置另一列为索引列,:

df=df.reset_index('列名')

如果两个表纵向拼接,而且索引时数字的情况下,比如表1的索引时从0到89,表2的索引是从0到9,那么拼接后的表的索引不是从0到99.而是先从0到89,然后再从0到9,因此需要重置索引

data.reset_index(drop=True,inplace=True)

注意这里的inplace,默认情况下是False,这里需要将其设为True,否则好像索引还是乱的,具体原因未知。

分组:

data.groupby(by='字段名',as_index=True)#as_index默认值为True,表示将该字段作为索引,如果是False,则该列不是索引
##################举例######################
data.groupby('continent').sum()
data.groupby('continent').mean()
data.groupby('continent').字段1.mean()

除了按照列名分组,还可以按照索引分组,比如经过处理后的索引可能好几个索引都相同
查看某一列的指定统计信息:

data.字段名.agg(['max','min','mean'])

pandas中的unstack函数的用法,暂时不是很明白,
题目:Present the mean preTestScores grouped by regiment and company without heirarchical indexing,
原数据是这样的,
python数据分析——pandas的应用_第3张图片
python数据分析——pandas的应用_第4张图片python数据分析——pandas的应用_第5张图片

regiment.groupby(['regiment','company']).mean().preTestScore.unstack()#得出的结果见左图
regiment.groupby(['regiment','company']).mean().preTestScore #得出的结果见右图

pandas模块中的apply方法的应用:
  根据我现在见过的用法,apply是将某一个函数或者lambda函数应用的某一列的数值,函数是对单个元素做某一种变化,将函数运用到某一列,就会对这一列的每一个元素做同样的函数变换
  python数据分析——pandas的应用_第6张图片python数据分析——pandas的应用_第7张图片
apply与applymap的区别:
  apply是用于行和列的计算,只能一行一行或一列一列,而applymap可用于整个数据框的计算。
查看各列中的最大值最小值:

data.idmax()#返回各列的最大值
data.idmin()#返回各列的最小值

与日期有关

将某一列数据转化为日期格式:

data.=pd.to_datetime(data.,format='%Y')#format也可以是月、日等
data["Yr_Mo_Dy"] = pd.to_datetime(data["Yr_Mo_Dy"])#年月日

将年月日格式的数据转化为年格式的数据:

data..字段.to_period('A')

对时间序列数据重采样和频率转换:

data.resample('采样频率')
采样频率如10AS(10年),30S(10秒)、3T(三分钟)

有个数据框的时间列本来是年月日,重采样,按照一周的频率:两种方法:

data.groupby(data.index.to_period('W')).mean()
或者
data.resample('W').mean()

重采样之后,一般是求这期间的综合或者均值

data.resample('1Y').sum()#求和
data.resample('1Y').mean()#求这段期间的均值

两个表的拼接

两个表的字段相同的情况下,将两个表纵向拼接:

data=pd.concat([data1,data2])
或者
data=data1.append(data2)

两个表的列相同的情况下,将两个表进行横向拼接:

data=pd.concat([data1,data2],axis=1)

当两个表中存在共同的字段,也存在不同字段,且两个表的行数相同的情况下,融合两个表的不同列

pd.merge(data1,data2,on='公共字段')
比如
pd.merge(all_data, data3, on='subject_id')

python数据分析——pandas的应用_第8张图片
融合两个表时,选用的字段,字段分别是重复与不重复的情况下融合两个表

pd.merge(data1,data2,on='subject_id',how='inner')#重复,默认情况
pd.merge(data1,data2,on='subject_id',how='outer')#不重复

将序列(Series)转换为数据框的格式:

序列=序列.to_frame()

将离散数据转换成二元数据,如果某列数据是几种离散数据构成的,就可以将该列进行转化,比如:原数据中有一列Embark,有三种离散值S、Q、C,将其进行转化之后,将转化得到的数据添加到原数据表中,可见下图,数据框中会新增三列。

data_new= pd.get_dummies(traindata.列名)
data=data.join(data_new)

在这里插入图片描述

与空值相关

统计各列的空值个数:

data.isnull().sum()

统计非空值的个数:

data.nutnull().sum()

利用pandas中的plot.bar绘制堆叠柱状图

对于一个表格,(如下例),天气等级本来是一列数据,要首先把数据根据天气等级分组,分组后累加变成只有四行的数据,然后绘制柱状图,这其中,行称为x轴,列为y轴

weather_df = Bike_data.groupby('weather', as_index=True).agg({'casual':'mean',
                                                              'registered':'mean'})
weather_df.plot.bar(stacked=True,
                    title = 'Average number of rentals initiated per hour in different weather')              
#这里stack控制是否将柱状图堆叠,默认值为False

python数据分析——pandas的应用_第9张图片       python数据分析——pandas的应用_第10张图片    python数据分析——pandas的应用_第11张图片
      stacked=True                 stacked=False

你可能感兴趣的:(python数据分析——pandas的应用)