文章目录
- 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 |
---|