- 导入输出文件
- 读取数据
- 筛选列
- 删除列
- 删除行
- 修改列名
- 隐藏列
- 隐藏索引
- 设置索引列
- 求交集(A∩B)
- 求A与B不共有的部分((A+B)-(A∩B))
- 求差集(A-B)
- 去除重复行
- 修改列宽
使用python-pandas处理excel数据时,常用命令汇总 导入输出文件
导入文件:
df = pd.read_excel('文件路径/文件名.xlsx')
#读取指定sheet
df = pd.read_excel("test.xlsx", engine="openpyxl", sheet_name="表1")
导出文件:
df.to_excel('输出文件名.xlsx')
读取数据
筛选列
将原表中的某列或某几列复制到新表
导入原表:
import pandas as pd
df = pd.read_csv('match.csv')
df
筛选列
df1=df[["Name","Team","Age","Salary"]]
df1
删除Excel列:
df1为删除列后的表,df为原表
# labels=["列A", "列B"] 表示删除那一列或哪几列;axis = 1表示删除列 df1 = df.drop(labels=["College","Salary"],axis = 1)删除行
删除Excel中索引为XX的行:
df为原表,df1为删除后表
# df.drop()表示删除,df.index()确定索引, 删除某一行 df1 = df.drop(df.index[0],inplace = False) # 删除索引为0的行,inplace=False不改变原表 删除多行(索引连续) df1 = df.drop(df.index[2:4],inplace = False) # 删除索引为2和3的行,inplace=False不改变原表
修改数据中的表头名称
#columns={'A':'A1','B':'B1'}表示修改的列修改为什么;rename()表示重命名
df.rename(columns={'Name':'姓名','Age':'年龄'}, inplace = True) #inplace表示修改原表
#输出结果如下:
隐藏列
df.style.hide_index().hide_columns(['XX','XX','XX'])隐藏索引
只是隐藏索引,导出文件,仍会导出索引
df.style.hide_index()设置索引列
将某一列作为索引列:
import pandas as pd
df = pd.read_csv('match.csv')
df.set_index('Name', inplace=True)
df
# 输出结果:
取消索引列,恢复默认索引:
#使用reset_index()取消索引 df.reset_index() #输出结果:
reset_index() 方法将 DataFrame 索引重置为默认数字索引,在以下情况下特别有用:
- 执行数据整理时——尤其是过滤数据或删除缺失值等预处理操作,会导致较小的 DataFrame 具有不再连续的数字索引
- 当索引应该被视为一个常见的 DataFrame 列时
- 当索引标签没有提供有关数据的任何有价值的信息时
# 使用 ndarrays 创建2张表,都又共同字段“学号”
# 使用 ndarrays 创建表
dataA = {'学号':['1', '2', '3','4','5'],'姓名':['张三','里斯','王五','查理','roise']}
A = pd.DataFrame(dataA)
dataB = {'学号':['0','1', '2', '3','4','5','7'],'年龄':['20','23','22','34','33','12','28'],'成绩':['无','89','90','67','88','78','90']}
B = pd.DataFrame(dataB)
print(A)
print(B)
输出:
A 学号 姓名
0 1 张三
1 2 里斯
2 3 王五
3 4 查理
4 5 roise
B 学号 年龄 成绩
0 0 20 无
1 1 23 89
2 2 22 90
3 3 34 67
4 4 33 88
5 5 12 78
6 7 28 90
#求交集
A.merge(B) #第一种写法
pd.merge(A, B, on=['学号']) #第二种写法, on表示用哪个字段合并,可以多个
均输出:
学号 姓名 年龄 成绩
0 1 张三 23 89
1 2 里斯 22 90
2 3 王五 34 67
3 4 查理 33 88
4 5 roise 12 78
求A与B不共有的部分((A+B)-(A∩B))
求A表与B表的不重复的部分,即(A+B)-(A∩B)
注意:求差集时,若A表与B表的表头一致,则直接返回对应差集,若表头不一致,填充NA
#test
dataA = {'学号':['1', '2', '3','4','5','6'],'年龄':['23','22','34','33','12','27'],'成绩':['89','90','67','88','78','98']}
A = pd.DataFrame(dataA)
dataB = {'学号':['0','1', '2', '3','4','5','7'],'年龄':['20','23','22','34','33','12','28'],'成绩':['无','89','90','67','88','78','90']}
B = pd.DataFrame(dataB)
print(A)
print(B)
输出:
学号 年龄 成绩
0 1 23 89
1 2 22 90
2 3 34 67
3 4 33 88
4 5 12 78
5 6 27 98
学号 年龄 成绩
0 0 20 无
1 1 23 89
2 2 22 90
3 3 34 67
4 4 33 88
5 5 12 78
6 7 28 90
####
res = pd.concat([A,B]).drop_duplicates(subset=['学号'],keep=False)
res
输出:
res 学号 年龄 成绩
5 6 27 98
0 0 20 无
6 7 28 90
求差集(A-B)
现有表A,B,A与B中有重复数据C,要找出A表中有B表中没有的数据,即A与B 的差集(A-B),也即(A-C)
首先用交集求出C:df_a.merge(df_b) 或者 pd.merge(df_a,df_b,on = ['共有字段'])
再用A减去A与B的交集C :pd.concat([df_a,df_b]).drop_duplicates(subset=['XXX'],keep=False)
注意:A与C最好表头一致,如果不一致,会多出很多列,也可以后面删除
#实例
dataA = {'学号':['1', '2', '3','4','5','6'],'年龄':['23','22','34','33','12','27'],'成绩':['89','90','67','88','78','98']}
B = pd.DataFrame(dataA)
dataB = {'学号':['0','1', '2', '3','4','5','7'],'年龄':['20','23','22','34','33','12','28'],'成绩':['无','89','90','67','88','78','90']}
A = pd.DataFrame(dataB)
print(A)
print(B)
输出:
A 学号 年龄 成绩
0 0 20 无
1 1 23 89
2 2 22 90
3 3 34 67
4 4 33 88
5 5 12 78
6 7 28 90
B 学号 年龄 成绩
0 1 23 89
1 2 22 90
2 3 34 67
3 4 33 88
4 5 12 78
5 6 27 98
#求交集A∩B
C = A.merge(B)
C
输出:
C 学号 年龄 成绩
0 1 23 89
1 2 22 90
2 3 34 67
3 4 33 88
4 5 12 78
chaji = pd.concat([A,C]).drop_duplicates(subset=['学号'],keep=False)
chaji
输出:
A-C 学号 年龄 成绩
0 0 20 无
6 7 28 90
@
@
@
分享:
方法一:
如果现在要把A中有且B中没有的数据,也就是新增部分,加到B表中去,该如何操作呢?
其实就是A与B求差集(A-C)后,再与B求并集
在上面的基础上进行如下操作 res = pd.merge(B,chaji, on=['学号','年龄','成绩'], how='outer') res 输出: 学号 年龄 成绩 0 1 23 89 1 2 22 90 2 3 34 67 3 4 33 88 4 5 12 78 5 6 27 98 6 0 20 无 7 7 28 90
方法二:A+B后,选择性看是否需要去重
直接求A与B 的并集,如果B中与A中字段数据不一致,需要按字段将数据去重,去重的时候,默认保留上一行,不保证数据准确性,最好A与B的表头一致。
dataA = {'学号':['1', '20', '3','4','5','6'],'年龄':['23','000','34','33','12','27'],'成绩':['89','90','67','88','78','98']}
B = pd.DataFrame(dataA)
dataB = {'学号':['0','1', '20', '3','4','5','7'],'年龄':['20','23','22','34','33','12','28'],'成绩':['无','89','90','67','88','78','90']}
A = pd.DataFrame(dataB)
print(A)
print(B)
输出:可以注意到B中明显有一个错误数据——学号:20
A 学号 年龄 成绩
0 0 20 无
1 1 23 89
2 20 22 90
3 3 34 67
4 4 33 88
5 5 12 78
6 7 28 90
B 学号 年龄 成绩
0 1 23 89
1 20 000 90
2 3 34 67
3 4 33 88
4 5 12 78
5 6 27 98
# A与B求并集
res = pd.merge(B,A, on=['学号','年龄','成绩'], how='outer')
res
输出:
学号 年龄 成绩
0 1 23 89
1 20 000 90
2 3 34 67
3 4 33 88
4 5 12 78
5 6 27 98
6 0 20 无
7 20 22 90
8 7 28 90
#去重,如果数据重复,自动保存上边那条,不保证结果准确性
res1 = res.drop_duplicates(['学号'])
res1
输出:
学号 年龄 成绩
0 1 23 89
1 20 000 90
2 3 34 67
3 4 33 88
4 5 12 78
5 6 27 98
6 0 20 无
8 7 28 90
去除重复行
#原始数据
dataA = {'学号':['0','1','0','1','0','1'],'年龄':['20','23','20','23','20','24'],'成绩':['89','90','89','90','89','96']}
df = pd.DataFrame(dataA)
输出:
学号 年龄 成绩
0 0 20 89
1 1 23 90
2 0 20 89
3 1 23 90
4 0 20 89
5 1 24 96
- 删除所有重复行
注意:必须每一列数据都一样才会删除
---删除所有重复行--- df_res = df.drop_duplicates() 输出: 学号 年龄 成绩 0 0 20 89 1 1 23 90 5 1 24 96
- 删除指定列重复的数据
最后只保留学号去重后,最上边的数据,学号为“1”,年龄为“24”的数据也被删除
---删除“学号”列重复的数据--- res = df.drop_duplicates(['学号']) res 输出: 学号 年龄 成绩 0 0 20 89 1 1 23 90
- 保留最后出现的值,使用关键字keep=‘last’
保留了学号为“1”,年龄为“24”那行
也可以按照多列去重
---去重后,保留最后一次出现的数据--- res = df.drop_duplicates(['学号'], keep='last') res 输出: 学号 年龄 成绩 4 0 20 89 5 1 24 96 #按照多列去重 res = df.drop_duplicates(['学号', '年龄'], keep='last') res 输出: 学号 年龄 成绩 3 1 23 90 4 0 20 89 5 1 24 96修改列宽
- 只修改Jupyter notebook显示,可以使用Style功能,对导出表无影响
### Test data
df.style.set_properties(subset=['Name'], **{'width': '200px'})
#输出结果如下:
- 修改导出表列宽
python修改导出excel列宽



