【Pandas 入门-2】增加,删除与合并数据 concat, merge

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张三95828492
1赵四100908969
2王五88887875

在原数据末尾增加一行数据时,比较简单的方式是用 loc 函数,df.loc[行索引] = 新行值

df.loc[3] = ['马六', 65, 70, 69, 55]  # 在末尾增加一行数据
df
姓名统计学高数英语计算机
0张三95828492
1赵四100908969
2王五88887875
3马六65706955

若要在指定位置插入列,则需要用到 insert 函数。

df.insert(1, '运筹学', [61, 72, 84, 81]) # 在第 1 列后面插入新的一列
df
姓名运筹学统计学高数英语计算机
0张三6195828492
1赵四72100908969
2王五8488887875
3马六8165706955
df.insert(3, 'Python', [81, 76, 74, 71]) # 在第 4 列后面插入新的一列
df
姓名运筹学统计学Python高数英语计算机
0张三619581828492
1赵四7210076908969
2王五848874887875
3马六816571706955

若要在指定位置插入行,目前 Pandas 还没有专门的函数,一般采用concat函数合并多个 DataFrame 的方式,增加多列或多行数据也可以使用 concat函数或merge函数,具体参看后面的合并数据章节。

1.3.2 删除数据

Pandas 可以利用drop函数删除行数据或列数据。删除一行时,参数为行标签名以及inplace = True。若没有参数inplace = True,原始的 DataFrame 数据不变。

df.drop(3, inplace = True) # 删除第 3 行
df
姓名运筹学统计学Python高数英语计算机
0张三619581828492
1赵四7210076908969
2王五848874887875

删除一列时,多了一个参数axis = 1

df.drop('英语', inplace = True, axis = 1)
df
姓名运筹学统计学Python高数计算机
0张三6195818292
1赵四72100769069
2王五8488748875
df.drop(['运筹学', '高数'], inplace = True, axis = 1) # 删除两行
df
姓名统计学Python计算机
0张三958192
1赵四1007669
2王五887475

1.3.3 合并数据

Pandas 中比较常用的两个合并数据的方法是concatmerge。 当两个 DataFrame 数据表具有完全相同的列标签时,一般用concat,其他情况下多用merge

df1 = pd.DataFrame({'姓名': ['张三', '李四', '王五'], '统计学': [85, 68, 90], '高数': [82, 63, 88], '英语': [84, 90, 78]})
df1
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
df2 = pd.DataFrame({'姓名': ['马大帅', '陈小虎'], '统计学': [83, 59], '高数': [92, 70], '英语': [94, 78]})
df2
姓名统计学高数英语
0马大帅839294
1陈小虎597078

两张表具有完全相同的行名,用concat合并的代码如下:

pd.concat([df1, df2])  #  注意中括号不等丢
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
0马大帅839294
1陈小虎597078

若要合并后的 index 重新命名,可以加参数ignore_index = True,让合并后数据的 index 重新从小到大命名:

pd.concat([df1, df2], ignore_index = True)
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
3马大帅839294
4陈小虎597078

假如有下面的数据:

df3 = pd.DataFrame({'姓名': ['张三', '李四', '王五'], '会计': [75, 78, 80], '管理学': [94, 96, 88]})
df3
姓名会计管理学
0张三7594
1李四7896
2王五8088

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张三8582847594
1李四6863907896
2王五9088788088

merge也能实现concat的合并效果,例如,合并 df1 与 df2:

df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'outer')
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
3马大帅839294
4陈小虎597078

在上面的代码中,匹配的字段为所有的列,连接方式为外连接,实现结果与concat相同。若连接方式为其他类型,显示效果如下:

df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'inner')  # 内连接时两个数据表匹配字段的交集为空
姓名统计学高数英语
df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'left')  # 左连接时保留左数据表的所有匹配字段
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'right')  # 右连接时保留右数据表的所有匹配字段
姓名统计学高数英语
0马大帅839294
1陈小虎597078

在合并数据表时,若某些字段没有对应数据,Pandas 会自动用 NaN 替代,下面的例子展示了不同连接方式的效果。

df1 = pd.DataFrame({'班级': ['一班', '二班', '一班'], '姓名': ['张三', '李四', '王五'], '性别': ['男', '男', '女'], '籍贯': ['北京', '上海', '重庆']})
df1
班级姓名性别籍贯
0一班张三北京
1二班李四上海
2一班王五重庆
df2 = pd.DataFrame({ '姓名': ['张三', '陈小虎'], '统计学': [85, 59]})
df2
姓名统计学
0张三85
1陈小虎59
df1.merge(df2, on = '姓名')
班级姓名性别籍贯统计学
0一班张三北京85
df1.merge(df2, on = '姓名', how = 'outer') # 某些字段没有对应数据,则显示为 NaN
班级姓名性别籍贯统计学
0一班张三北京85.0
1二班李四上海NaN
2一班王五重庆NaN
3NaN陈小虎NaNNaN59.0
df1.merge(df2, on = '姓名', how = 'left')
班级姓名性别籍贯统计学
0一班张三北京85.0
1二班李四上海NaN
2一班王五重庆NaN
df1.merge(df2, on = '姓名', how = 'right')
班级姓名性别籍贯统计学
0一班张三北京85
1NaN陈小虎NaNNaN59
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心态与习惯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值