文章目录 1.3 增加,删除与合并数据 1.3.1 增加数据 1.3.2 删除数据 1.3.3 合并数据
1.3 增加,删除与合并数据
1.3.1 增加数据
在原数据末尾增加一列时,语法为 df[‘新列名'] = 某个值或某个元素个数与 DataFrame 列数相同的列表
,例如:
df = pd. DataFrame( { '姓名' : [ '张三' , '李四' , '王五' ] , '统计学' : [ 95 , 100 , 88 ] , '高数' : [ 82 , 90 , 88 ] , '英语' : [ 84 , 89 , 78 ] } )
df[ '计算机' ] = [ 92 , 69 , 75 ]
df
姓名 统计学 高数 英语 计算机 0 张三 95 82 84 92 1 赵四 100 90 89 69 2 王五 88 88 78 75
在原数据末尾增加一行数据时,比较简单的方式是用 loc 函数,df.loc[行索引] = 新行值
。
df. loc[ 3 ] = [ '马六' , 65 , 70 , 69 , 55 ]
df
姓名 统计学 高数 英语 计算机 0 张三 95 82 84 92 1 赵四 100 90 89 69 2 王五 88 88 78 75 3 马六 65 70 69 55
若要在指定位置插入列,则需要用到 insert
函数。
df. insert( 1 , '运筹学' , [ 61 , 72 , 84 , 81 ] )
df
姓名 运筹学 统计学 高数 英语 计算机 0 张三 61 95 82 84 92 1 赵四 72 100 90 89 69 2 王五 84 88 88 78 75 3 马六 81 65 70 69 55
df. insert( 3 , 'Python' , [ 81 , 76 , 74 , 71 ] )
df
姓名 运筹学 统计学 Python 高数 英语 计算机 0 张三 61 95 81 82 84 92 1 赵四 72 100 76 90 89 69 2 王五 84 88 74 88 78 75 3 马六 81 65 71 70 69 55
若要在指定位置插入行,目前 Pandas 还没有专门的函数,一般采用concat
函数合并多个 DataFrame 的方式,增加多列或多行数据也可以使用 concat
函数或merge
函数,具体参看后面的合并数据章节。
1.3.2 删除数据
Pandas 可以利用drop
函数删除行数据或列数据。删除一行时,参数为行标签名以及inplace = True
。若没有参数inplace = True
,原始的 DataFrame 数据不变。
df. drop( 3 , inplace = True )
df
姓名 运筹学 统计学 Python 高数 英语 计算机 0 张三 61 95 81 82 84 92 1 赵四 72 100 76 90 89 69 2 王五 84 88 74 88 78 75
删除一列时,多了一个参数axis = 1
:
df. drop( '英语' , inplace = True , axis = 1 )
df
姓名 运筹学 统计学 Python 高数 计算机 0 张三 61 95 81 82 92 1 赵四 72 100 76 90 69 2 王五 84 88 74 88 75
df. drop( [ '运筹学' , '高数' ] , inplace = True , axis = 1 )
df
姓名 统计学 Python 计算机 0 张三 95 81 92 1 赵四 100 76 69 2 王五 88 74 75
1.3.3 合并数据
Pandas 中比较常用的两个合并数据的方法是concat
与merge
。 当两个 DataFrame 数据表具有完全相同的列标签时,一般用concat
,其他情况下多用merge
。
df1 = pd. DataFrame( { '姓名' : [ '张三' , '李四' , '王五' ] , '统计学' : [ 85 , 68 , 90 ] , '高数' : [ 82 , 63 , 88 ] , '英语' : [ 84 , 90 , 78 ] } )
df1
姓名 统计学 高数 英语 0 张三 85 82 84 1 李四 68 63 90 2 王五 90 88 78
df2 = pd. DataFrame( { '姓名' : [ '马大帅' , '陈小虎' ] , '统计学' : [ 83 , 59 ] , '高数' : [ 92 , 70 ] , '英语' : [ 94 , 78 ] } )
df2
姓名 统计学 高数 英语 0 马大帅 83 92 94 1 陈小虎 59 70 78
两张表具有完全相同的行名,用concat
合并的代码如下:
pd. concat( [ df1, df2] )
姓名 统计学 高数 英语 0 张三 85 82 84 1 李四 68 63 90 2 王五 90 88 78 0 马大帅 83 92 94 1 陈小虎 59 70 78
若要合并后的 index 重新命名,可以加参数ignore_index = True
,让合并后数据的 index 重新从小到大命名:
pd. concat( [ df1, df2] , ignore_index = True )
姓名 统计学 高数 英语 0 张三 85 82 84 1 李四 68 63 90 2 王五 90 88 78 3 马大帅 83 92 94 4 陈小虎 59 70 78
假如有下面的数据:
df3 = pd. DataFrame( { '姓名' : [ '张三' , '李四' , '王五' ] , '会计' : [ 75 , 78 , 80 ] , '管理学' : [ 94 , 96 , 88 ] } )
df3
姓名 会计 管理学 0 张三 75 94 1 李四 78 96 2 王五 80 88
df1 与 df3 的姓名相同,但列名不完全相同。我们想把 df3 的列添加到 df1 中,此时就要使用merge
方法了,它的使用语法一般如下:
DataFrame.merge(right, how='inner', on=None) right 需要合并的另一个 DataFrame 数据 how 默认为 'inner',表示内连接,取两个数据表中匹配字段的交集进行合并 'outer',表示外连接,取两个数据表中匹配字段的并集进行合并 'left',表示左连接,取左边数据表中匹配字段进行合并 'right',表示右连接,取右边数据表中匹配字段进行合并 on 匹配的字段(列),可以是一个或多个
因此,对于 df1 与 df3,用merge
合并时,匹配的字段(列名)为’姓名’:
df1. merge( df3, on = '姓名' )
姓名 统计学 高数 英语 会计 管理学 0 张三 85 82 84 75 94 1 李四 68 63 90 78 96 2 王五 90 88 78 80 88
merge
也能实现concat
的合并效果,例如,合并 df1 与 df2:
df1. merge( df2, on = [ '姓名' , '统计学' , '高数' , '英语' ] , how = 'outer' )
姓名 统计学 高数 英语 0 张三 85 82 84 1 李四 68 63 90 2 王五 90 88 78 3 马大帅 83 92 94 4 陈小虎 59 70 78
在上面的代码中,匹配的字段为所有的列,连接方式为外连接,实现结果与concat
相同。若连接方式为其他类型,显示效果如下:
df1. merge( df2, on = [ '姓名' , '统计学' , '高数' , '英语' ] , how = 'inner' )
df1. merge( df2, on = [ '姓名' , '统计学' , '高数' , '英语' ] , how = 'left' )
姓名 统计学 高数 英语 0 张三 85 82 84 1 李四 68 63 90 2 王五 90 88 78
df1. merge( df2, on = [ '姓名' , '统计学' , '高数' , '英语' ] , how = 'right' )
姓名 统计学 高数 英语 0 马大帅 83 92 94 1 陈小虎 59 70 78
在合并数据表时,若某些字段没有对应数据,Pandas 会自动用 NaN 替代,下面的例子展示了不同连接方式的效果。
df1 = pd. DataFrame( { '班级' : [ '一班' , '二班' , '一班' ] , '姓名' : [ '张三' , '李四' , '王五' ] , '性别' : [ '男' , '男' , '女' ] , '籍贯' : [ '北京' , '上海' , '重庆' ] } )
df1
班级 姓名 性别 籍贯 0 一班 张三 男 北京 1 二班 李四 男 上海 2 一班 王五 女 重庆
df2 = pd. DataFrame( { '姓名' : [ '张三' , '陈小虎' ] , '统计学' : [ 85 , 59 ] } )
df2
df1. merge( df2, on = '姓名' )
df1. merge( df2, on = '姓名' , how = 'outer' )
班级 姓名 性别 籍贯 统计学 0 一班 张三 男 北京 85.0 1 二班 李四 男 上海 NaN 2 一班 王五 女 重庆 NaN 3 NaN 陈小虎 NaN NaN 59.0
df1. merge( df2, on = '姓名' , how = 'left' )
班级 姓名 性别 籍贯 统计学 0 一班 张三 男 北京 85.0 1 二班 李四 男 上海 NaN 2 一班 王五 女 重庆 NaN
df1. merge( df2, on = '姓名' , how = 'right' )
班级 姓名 性别 籍贯 统计学 0 一班 张三 男 北京 85 1 NaN 陈小虎 NaN NaN 59