Python三剑客之Pandas库(二)

pandas的数据ETL篇

1.数据抽取

在数据分析过程中,并不是所有的数据都是我们需要的.所有我们可以使用DataFrame对象中的两个属性loc属性和iloc属性抽取其中的部分数据.

DataFrame对象中的loc属性和iloc属性都可以抽取数据.
loc属性:以列名和行名作为参数,当只有一个参数时候,默认是行名,即抽取郑航数据,包括所有列,如df.loc[“富荣”]
iloc属性:以行和列位置索引作为参数.0表示第一行,1表示第二行,一次类推.只有一个参数时,默认是行索引,抽取郑航数据,包含所有列,如抽取第一行数据,df.iloc[0]
数据准备:

import pandas as pd
#解决数据输出列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
dt=[[105,115,220],[106,107,219],[110,111,222],[109,104,214],[108,98,238]]
name=["肖德来","付文德","孙华弟","安德宝","富荣"]
columns=["语文","数学","综合"]
df=pd.DataFrame(data=dt,index=name,columns=columns)
print(df)
        语文  数学  综合
肖德来   105   115   220
付文德   106   107   219
孙华弟   110   111   222
安德宝   109   104   214
富荣     108    98   238

按行抽取
#按照行名称获取一行

df.loc["付文德"]#按照行名获取一行数据
语文    106
数学    107
综合    219
Name: 付文德, dtype: int64

#按照行名称获取多行

df.loc["付文德":"安德宝"]#按照行名为文德到行名为安德宝获取所有行
        语文	数学	综合
付文德	106	107	219
孙华弟	110	111	222
安德宝	109	104	214
df.loc[["付文德","安德宝"]]#按照行名为文德和行名为安德宝获取的两行数据
   	    语文	数学	综合
付文德	106	107	219
安德宝	109	104	214

#按照行索引获取行

df.iloc[1]#按照索引获取一行数据
语文    106
数学    107
综合    219
Name: 付文德, dtype: int64

#按照行名称获取多行

df.iloc[1:3]#获取从第2行到4行的数据,不含第4行
        语文	数学	综合
付文德	106	107	219
孙华弟	110	111	222
df.iloc[[1,3]]#获按照行名为文德和行名为安德宝的两行
   	    语文	数学	综合
付文德	106	107	219
安德宝	109	104	214

除了以上的方法还可以利用切片的思路添加第三参数,如下

df.loc[:"安德宝":2]#按照行名从前往第一行隔2行开始获取行数据
	    语文	数学	综合
肖德来	105	115	220
孙华弟	110	111	222
df.loc[:"安德宝":-2]#按照行名从后往前第一行隔2行开始获取行数据
    语文	数学	综合
富荣	108	98	238
df.loc[::2]#按照行索引从前往后隔2行开始获取行数据
        语文	数学	综合
肖德来	105	115	220
孙华弟	110	111	222
富荣	108	98	238
df.loc[::-2]#按照行索引从后往前第一行隔2行开始获取行数据
	语文	数学	综合
富荣	108	98	238
孙华弟	110	111	222
肖德来	105	115	220

可以看出第三参数是负数的时候,输出结果有由后往前获取行再输出,那么我们可以将第三参数设定为-1来让源数据倒序输出.

df.loc[::-1]#按行索引将原来数据倒序输出
	语文	数学	综合
富荣	108	98	238
安德宝	109	104	214
孙华弟	110	111	222
付文德	106	107	219
肖德来	105	115	220

上面我们都是单独的按照行或者列抽取数据,那么我们能同时按照行列收取数据吗?当然是可以的,那下来我们就开始同时使用行列抽取数据.
loc[行名称,列名称]
iloc[行索引,列索引]

df.loc["付文德","语文"]#获取行名付文德的语文列的数据,输出值是数字
106
df.loc[["付文德"],["语文"]]#获取行名付文德的语文列的数据,输出值是DataFrame对象
	    语文
付文德	106
df.loc[["付文德"],["语文","数学"]]#获取行名付文德的语文列数学列的数据,输出值是DataFrame对象
       语文	数学
付文德	106	107
df.iloc[1,2]#获取行索引为2和列索引为2的交叉区域的数据,输出值是数字
219
df.iloc[[1],[2]]   #获取行索引为2和列索引为2的交叉区域的数据,输出值是DataFrame
	    综合
付文德	219
df.iloc[1:,[2]]#从第2行到最后一行的第3列,输出值是DataFrame
    	综合
付文德	219
孙华弟	222
安德宝	214
富荣	238
df.iloc[1:,[0,2]]#从第2行到最后一行的第1列和第3列,输出值是DataFrame
        语文	综合
付文德	106	219
孙华弟	110	222
安德宝	109	214
富荣	108	238
df.iloc[:,2]#从所有行第3列,输出值是DataFrame
肖德来    220
付文德    219
孙华弟    222
安德宝    214
富荣      238
Name: 综合, dtype: int64

2.数据的增加,修改和删除

数据的增加

2.1增加一列

2.1.1.直接为DataFrame赋值

df["思想品德"]=[88,90,89,76,100]
df
	语文	数学	综合	思想品德
肖德来	105	115	220	88
付文德	106	107	219	90
孙华弟	110	111	222	89
安德宝	109	104	214	76
富荣	108	98	238	100

2.1.2.使用loc属性在DataFrame对象的最后增加一列

df.loc[:,"生物"]=[88,79,66,59,86]
df
	语文	数学	综合	思想品德	生物
肖德来	105	115	220	88	88
付文德	106	107	219	90	79
孙华弟	110	111	222	89	66
安德宝	109	104	214	76	59
富荣	108	98	238	100	86

2.1.3.在指定列插入一列,主要使用insert方法

df.insert(2,"外语",[15,22,86,95,99])
df
	语文	数学	外语	综合	思想品德	生物
肖德来	105	115	15	220	88	88
付文德	106	107	22	219	90	79
孙华弟	110	111	86	222	89	66
安德宝	109	104	95	214	76	59
富荣	108	98	99	238	100	86

2.2 增加一行
2.2.1使用loc属性实现

df.loc["钱老板"]=[86,88,95,15,23,15]
df

语文	数学	外语	综合	思想品德	生物
肖德来	105	115	15	220	88	88
付文德	106	107	22	219	90	79
孙华弟	110	111	86	222	89	66
安德宝	109	104	95	214	76	59
富荣	108	98	99	238	100	86
钱老板	86	88	95	15	23	15

2.2.2 增加多行数据

df=df.append(pd.DataFrame({
     "语文":[85,86],"数学":[86,15],"外语":[22,15],"综合":[125,222],"思想品德":[95,86],"生物":[86,95]},index=["赵三茂","刘浪"]))
df

        语文	数学	外语	综合	思想品德	生物
肖德来	105	115	15	220	88	88
付文德	106	107	22	219	90	79
孙华弟	110	111	86	222	89	66
安德宝	109	104	95	214	76	59
富荣	108	98	99	238	100	86
钱老板	86	88	95	15	23	15
赵三茂	85	86	22	125	95	86
刘浪	86	15	15	222	86	95

修改数据

修改列标题

#将数学修改成数学(一)
#df.columns=["语文","数学(一)","外语","综合","思想品德","生物"]
df.rename(columns={
     "数学":"数学(一)"},inplace=True)
df
	语文	数学(一)	外语	综合	思想品德	生物
肖德来	105	115	15	220	88	88
付文德	106	107	22	219	90	79
孙华弟	110	111	86	222	89	66
安德宝	109	104	95	214	76	59
富荣	108	98	99	238	100	86
钱老板	86	88	95	15	23	15
赵三茂	85	86	22	125	95	86
刘浪	86	15	15	222	86	95

修改行标题
df.index=list[string]
df.rename({ : },axis=0,inplace=True)
修改数据
使用loc属性和iloc属性 ,在这里就不单独列举了

删除数据

DataFrame.drop(labels=None,axis=0,index=None,columns=None,level=None,inplace=False,erroes=“raise”)
参数说明:
labels:表示行标签或者列标签
axis:默认为0,axis=0表示按照行删除,axis=1表示按照列删除.
index:删除行,默认值为None.
columns:删除列,默认值为None
level:针对有两级索引的数据,level=0,表示按照第1级索引删除整行,level=1表示按照第2级索引删除整行,默认值为None.
inplace:可选参数,对源数据做出修改后返回一个新数据,默认值为Flase,如果为True,源数据直接就被替换.
erroes:参数值为ignore或raise,默认值为raise,如果为ignore(忽略),则取消错误

df.drop(["外语"],axis=1,inplace=True)#删除外语列
df.drop(["外语","思想品德"],axis=1,inplace=True)#删除外语和思想品德列
df.drop(columns="外语",inplace=True)#删除列名为外语的列
df.drop(labels="外语",inplace=True)#删除列标签为外语的列
df.drop(index="钱老板",inplace=True)#删除index为钱老板的行
df.drop(labels="钱老板",inplace=True)#删除行标签为钱老板的行

按照条件删除
例如

df.drop(index=df[df["数学"].isin(120)].index[0].inplace=True)
#删除数学包含分数120的行

累了 休息了

你可能感兴趣的:(Python,数据可视化,python,数据分析)