栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pandas 数据处理汇总

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pandas 数据处理汇总

文章目录
      • 导入输出文件
      • 读取数据
      • 筛选列
      • 删除列
      • 删除行
      • 修改列名
      • 隐藏列
      • 隐藏索引
      • 设置索引列
      • 求交集(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 索引重置为默认数字索引,在以下情况下特别有用:

  1. 执行数据整理时——尤其是过滤数据或删除缺失值等预处理操作,会导致较小的 DataFrame 具有不再连续的数字索引
  2. 当索引应该被视为一个常见的 DataFrame 列时
  3. 当索引标签没有提供有关数据的任何有价值的信息时
求交集(A∩B)

# 使用 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
  1. 删除所有重复行
    注意:必须每一列数据都一样才会删除
---删除所有重复行---
df_res = df.drop_duplicates()
输出:
			  学号  年龄  成绩
			0  0  20  89
			1  1  23  90
			5  1  24  96
  1. 删除指定列重复的数据
    最后只保留学号去重后,最上边的数据,学号为“1”,年龄为“24”的数据也被删除
---删除“学号”列重复的数据---
res = df.drop_duplicates(['学号'])
res
输出:
			学号	年龄	成绩
			0	0	20	89
			1	1	23	90
  1. 保留最后出现的值,使用关键字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
修改列宽
  1. 只修改Jupyter notebook显示,可以使用Style功能,对导出表无影响
### Test data
df.style.set_properties(subset=['Name'], **{'width': '200px'})

#输出结果如下:

  1. 修改导出表列宽
    python修改导出excel列宽
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029390.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号