在数据分析过程中,并不是所有的数据都是我们需要的.所有我们可以使用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.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的行
累了 休息了