导入库:
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对非数值型数据的处理(独热编码)
'''已知data中有几列数据是非数值型数据,处理方法如下'''
data=pd.get_dummies(data)
由以下例子可知,经过get_dummies()方法处理过的数据,输出结果是重组后的数据框
将DataFrane文件存储至csv文件,且不要行索引
data.to_csv('file_nane.csv',index=False)
'''如果不写index=False,输出的csv文件第一列是序号列'''