Python 从入门到实战45(Pandas数据操作)
我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。
上篇文章我们学习了pandas数据读写的相关基础知识。今天学习一下pandas数据操作的相关操作。
DataFrame 对象是pandas 模块中最常用的对象,该对象所呈现的数据与excel表格相似。因此,我们需要了解DataFrame 对象中的各种数据操作方法。
1、增加数据
DataFrame 对象添加一列数据,可以先创建列名,然后为其赋值。如下:
#DataFrame 对象添加一列数据
data = {'A':[1,2,3,4,5],
'B':[10,20,30,40,50],
'C':[11,22,33,44,54]
} #字典形式的数据
data_frame = pd.DataFrame(data) #创建DataFrame对象
#添加一列数据:D列
data_frame['D']=[100,200,300,400,500]
print(data_frame)
执行结果:
A B C D
0 1 10 11 100
1 2 20 22 200
2 3 30 33 300
3 4 40 44 400
4 5 50 54 500
2、删除数据
pandas 模块提供了drop()函数,用于删除DataFrame对象中的某行或者某列数据。
drop()函数常用参数:
参数名 |
参数含义 |
labels |
指定要删除的行索引或列名,可以是单个索引/标签、索引/标签列表或索引/标签数组。如果指定的是列名,需要将axis参数设置为1或columns |
axis |
设置删除行还是列,0表示删除行,1表示删除列,默认值为0。如果删除列,需要将axis设置为1或columns |
index |
设置要删除的行的索引或标签,相当于设置labels且axis为0 |
columns |
设置要删除的列的索引或标签,相当于设置labels且axis为1或columns |
level |
如果索引是多重索引,指定按多重索引中的哪个等级的索引删除,可以传入多重索引的下标或名称 |
inplace |
设置是否在DataFrame本身删除数据,默认为False,即在DataFrame的副本里删除数据,返回删除数据后的DataFrame。如果设置为True,则在调用drop()的DataFrame本身执行删除,返回值为None |
errors |
设置是否抛出错误,可以设置的值有{‘ignore’, ‘raise’},默认raise,表示抛出错误。ignore表示忽略错误,跳过传入的错误索引名或列名,正确的索引名或列名不受影响,正常执行删除 |
举例说明:
#DataFrame 对象添加一列数据
data = {'A':[1,2,3,4,5],
'B':[10,20,30,40,50],
'C':[11,22,33,44,54]
} #字典形式的数据
data_frame = pd.DataFrame(data) #创建DataFrame对象
#添加一列数据:D列
data_frame['D']=[100,200,300,400,500]
print(data_frame)
#删除行数据
data_frame.drop([0],inplace=True)
print("删除第一行数据后的结果:\n",data_frame)
#删除列数据:A列
data_frame.drop(labels="A",axis=1,inplace=True)
print("删除A行数据后的结果:\n",data_frame)
执行结果:
A B C D
0 1 10 11 100
1 2 20 22 200
2 3 30 33 300
3 4 40 44 400
4 5 50 54 500
删除第一行数据后的结果:
A B C D
1 2 20 22 200
2 3 30 33 300
3 4 40 44 400
4 5 50 54 500
删除A行数据后的结果:
B C D
1 20 22 200
2 30 33 300
3 40 44 400
4 50 54 500
如删除前3行数据
data_frame.drop(label=range(0,3),axis=0,inplace=True)
3、修改数据
修改DataFrame 中某一列中的某个元素,通过赋值方式来实现
#DataFrame 对象修改一列中某个索引的数据
data = {'A':[1,2,3,4,5],
'B':[10,20,30,40,50],
'C':[11,22,33,44,54]
} #字典形式的数据
data_frame = pd.DataFrame(data) #创建DataFrame 对象
data_frame["A"][1] = 22 #A列中索引为1的值修改为22
print("修改后的数据:\n",data_frame)
执行结果:
修改后的数据:
A B C
0 1 10 11
1 22 20 22
2 3 30 33
3 4 40 44
4 5 50 54
修改DataFrame 中某一列中的元素,通过赋值方式来实现
data = {'A':[1,2,3,4,5],
'B':[10,20,30,40,50],
'C':[11,22,33,44,54]
} #字典形式的数据
data_frame = pd.DataFrame(data) #创建DataFrame 对象
data_frame["A"][1] = 22 #A列中索引为1的值修改为22
print("修改后的数据:\n",data_frame)
#修改一整列的数据
data_frame["B"] = [101,202,303,404,505]
print("修改一整列的数据后:\n",data_frame)
执行结果:
修改一整列的数据后:
A B C
0 1 101 11
1 22 202 22
2 3 303 33
3 4 404 44
4 5 505 54
4、查询数据
如获取DataFrame 对象中某一列的数据。可以通过指定列名或者直接调用列名的属性来获取指定列的数据。
import pandas as pd #导入pandas 模块
#DataFrame 对象查询数据
data ={
"A":[10,20,30,40],
"B":[12,22,32,42],
"C":[14,24,34,44]
} #字典形式的数据
data_frame = pd.DataFrame(data) #字典数据形成DataFrame 对象
print("指定列名的数据为:\n",data_frame["A"])
print("指定列名属性的数据为:\n",data_frame.B)
执行结果:
指定列名的数据为:
0 10
1 20
2 30
3 40
Name: A, dtype: int64
指定列名属性的数据为:
0 12
1 22
2 32
3 42
Name: B, dtype: int64
Process finished with exit code 0
也可以查询多行,如第一到第二行的数据
print("查询两行的数据:\n",data_frame[0:2])
输出:
查询两行的数据:
A B C
0 10 12 14
1 20 22 24
5、NaN 数据处理
1)将元素修改为NaN
NaN 在numpy 模块中用于表示空缺数据,若要将某个数据元素修改为NaN,只需要调用numpy.NaN为需要修改的元素赋值即可。
如下:
data ={
"A":[10,20,30,40],
"B":[12,22,32,42],
"C":[14,24,34,44]
} #字典形式的数据
data_frame = pd.DataFrame(data) #字典数据形成DataFrame 对象
data_frame["A"][0] =numpy.nan
输出结果:
将第一列第一行的数据改为NaN后的数据:
A B C
0 NaN 12 14
1 20.0 22 24
2 30.0 32 34
3 40.0 42 44
2)统计NaN数据
pandas 提供了可以快速识别数据中的空缺值非空缺值的方法:isnull()方法用于识别数据中是否有空缺值,若有空缺值值返回为true。notnull()方法用于识别数据中是否有非空缺值,若有非空缺值值返回为true。
举例说明统计函数的使用方法:
data ={
"A":[10,20,30,40],
"B":[12,22,32,42],
"C":[14,24,34,44]
} #字典形式的数据
data_frame = pd.DataFrame(data) #字典数据形成DataFrame 对象
data_frame["A"][0] =numpy.nan
print("每列空缺值数量为:\n",data_frame.isnull().sum())#输出数据中空缺值数量
print("每列非空缺值数量为:\n",data_frame.notnull().sum())#输出数据中非空缺值数量
执行结果:
每列空缺值数量为:
A 1
B 0
C 0
dtype: int64
每列非空缺值数量为:
A 3
B 4
C 4
dtype: int64
3)筛选NaN
在实现数据中NaN元素的筛选时,需要使用dropna()函数来实现,例如,删除包含NaN元素所在的整行数据,如下:
data ={
"A":[10,20,30,40],
"B":[12,22,32,42],
"C":[14,24,34,44]
} #字典形式的数据
data_frame = pd.DataFrame(data) #字典数据形成DataFrame 对象
data_frame["A"][0] =numpy.nan
data_frame.dropna(axis=0,inplace=True)
print("删除有NaN元素所在的整行数据后为:\n",data_frame)
执行结果:
删除有NaN元素所在的整行数据后为:
A B C
1 20.0 22 24
2 30.0 32 34
3 40.0 42 44
另外,若是要删除含有NaN数据的那一列数据,axis 参数设置为1;
data_frame.dropna(axis=1,inplace=True)
print("删除有NaN元素所在的整列数据后为:\n",data_frame)
执行结果:
删除有NaN元素所在的整列数据后为:
B C
0 12 14
1 22 24
2 32 34
3 42 44
4)NaN元素的替换
可以使用fillna()函数将数据中NaN元素替换为同一个元素。如下:
#NaN元素的替换
data ={
"A":[10,None,30,40],
"B":[12,22,None,42],
"C":[14,24,34,None]
} #字典形式的数据
data_frame = pd.DataFrame(data) #创建DataFrame 对象
data_frame.fillna(0,inplace=True) #将所有数据中NaN元素替换为0
print(data_frame)#输出DataFrame 对象内容
执行结果:
A B C
0 10.0 12.0 14.0
1 0.0 22.0 24.0
2 30.0 0.0 34.0
3 40.0 42.0 0.0
Process finished with exit code 0
另外,如果需要将不同列中的NaN元素修改为不同的元素值,可以通过字典的方式对每列进行依次修改,如下:
#NaN元素每列进行不同的替换
data ={
"A":[10,None,30,40],
"B":[12,22,None,42],
"C":[14,24,34,None]
} #字典形式的数据
data_frame = pd.DataFrame(data) #创建DataFrame 对象
data_frame.fillna({"A":0,"B":110},inplace=True) #将所有数据中NaN元素替换为0
print(data_frame)#输出DataFrame 对象内容
执行结果:
A B C
0 10.0 12.0 14.0
1 0.0 22.0 24.0
2 30.0 110.0 34.0
3 40.0 42.0 NaN —–第3列没有替换。
今天先写学习到这里了,每天进步一点点。明天也要加油啊!
作者:立黄昏粥可温