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
相同。若连接方式为其他类型,显示效果如下:文章来源:https://www.toymoban.com/news/detail-641160.html
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 替代,下面的例子展示了不同连接方式的效果。文章来源地址https://www.toymoban.com/news/detail-641160.html
df1 = pd.DataFrame({'班级': ['一班', '二班', '一班'], '姓名': ['张三', '李四', '王五'], '性别': ['男', '男', '女'], '籍贯': ['北京', '上海', '重庆']})
df1
|
班级 |
姓名 |
性别 |
籍贯 |
0 |
一班 |
张三 |
男 |
北京 |
1 |
二班 |
李四 |
男 |
上海 |
2 |
一班 |
王五 |
女 |
重庆 |
df2 = pd.DataFrame({ '姓名': ['张三', '陈小虎'], '统计学': [85, 59]})
df2
df1.merge(df2, on = '姓名')
|
班级 |
姓名 |
性别 |
籍贯 |
统计学 |
0 |
一班 |
张三 |
男 |
北京 |
85 |
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 |
到了这里,关于【Pandas 入门-2】增加,删除与合并数据 concat, merge的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!