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‘或者逗号

参数usecols、engine、skipfooter的作用
usecols用于返回整个数据框中的子集,usecols=[1]代表返回第一列,engine是分析引擎,包括{‘C’和‘python’},skipfooter表示从尾部开始忽略。

dataframe = pd.read_csv('filename.csv', usecols=[1], engine='python', skipfooter=3)

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用于行列范围都是数字,比如data.iloc[4,5]
loc用于行列范围都是字符,比如data.loc['小明','age']
ix用于一个字符一个数字,比如data.ix[:3,'age']

给定一个字典(raw_data)的情况下,构造数据框:

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

**

行条件索引

当需要索引在一定范围内的数值时,比如某一列的数值满足在2<=x<=5,则不能直接用data[2<=data.x<=5],而应该是

data[(data.x>=2)&(data.x<=5)]
'''切记,一定要给两个条件都加上括号,否则会判定输入值超过1个'''
对某一列的数据进行计算、赋值新数据:

问题:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
如果直接通过索引某一列,对该列进行计算,会出现以上警告:解决办法:copy()比如下例:

'''先创建一个数据框'''
a=np.array([1,1,1,1,2,2,2,3,3,3,3,3,3,7,8,9])
b=np.ones(len(a))
data=pd.DataFrame(columns=['a','b'])
data.a=a
data.b=b
'''对a列进行计算'''
y=data["a"].copy()
y[y==1]+=0.5
y[y==2]+=3
y[(y>=7)&(y<10)]*=2
data.a=y
#data['a']=data['a'][data['a']==1]+0.5这样直接计算会发出警告,不采用
#最终结果data.a为:1.5,  1.5,  1.5,  1.5,  5. ,  5. ,  5. ,  3. ,  3. ,  3. ,  3. , 3. ,  3. , 14. , 16. , 18.

**

设置索引

将某一列设置为索引:

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

在这里插入图片描述
在这里插入图片描述
  在已经设置某一列为索引的情况下,设置另一列为索引列,:

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,
原数据是这样的,
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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

pandas模块中的apply方法的应用:
  根据我现在见过的用法,apply是将某一个函数或者lambda函数应用的某一列的数值,函数是对单个元素做某一种变化,将函数运用到某一列,就会对这一列的每一个元素做同样的函数变换
  在这里插入图片描述在这里插入图片描述
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()

去掉日期后面的时分秒,仅显示年月日,比如下表中,虽然直观上看是0962-06-01,但是输出值为1962-06-01 00:00:00,删去后面的时分秒

data.ymd=data.ymd.dt.date

在这里插入图片描述

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

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')

在这里插入图片描述
融合两个表时,选用的字段,字段分别是重复与不重复的情况下融合两个表

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

在这里插入图片描述       在这里插入图片描述    在这里插入图片描述
      stacked=True                 stacked=False

pandas对非数值型数据的处理(独热编码)

参考pandas.get_dummies 的用法

'''已知data中有几列数据是非数值型数据,处理方法如下'''
data=pd.get_dummies(data)

由以下例子可知,经过get_dummies()方法处理过的数据,输出结果是重组后的数据框
在这里插入图片描述
将DataFrane文件存储至csv文件,且不要行索引

data.to_csv('file_nane.csv',index=False)
'''如果不写index=False,输出的csv文件第一列是序号列'''
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值