怎样用python对Excel中的某些列去重?
你好!
需求描述:
- 依据某一列去重,结果包含原表所有的列;
- 依据某几列去重,结果表只含这几列;
提供.xlsx格式,输出也要表格。
难点:
- 表格数据量大,几万行以上,直接用Excel常常很卡,但有时WPS可以快些,但又因为WPS安装之后不好卸载,不愿用;
- 运行时间长,等圈圈转好久;
- 没法看到过程;
- 有时候依据某一列去重时,Excel仅操作这一列,其他的列原封不动保留,结果会出现“长短腿”,即被去重的列,值的数量明显数量少于其他列。而实际上,我们需要的是,对这一列去重,然后这一列留哪个值,那么与之关联的整行都要留下;
- 就是想用python,就是想写个文章emmm。。。
解释:
- 本次的表格放在桌面,代码默认表格在桌面,只需输入表格的名称即可(如5月销售表.xlsx)。可以调整表格的存储位置,在获取数据的方法get_data()中更改路径即可;
- 输出表格的位置同样在桌面,可以更改输出表的名称,在输出函数output()中更改;
- get_data()中,下面一行代码里的列号是需要根据自己的需求调整的:
data_124=data.iloc[:,[列号1,列号2,列号3,…]]
列表中的数字代表去重时依据的列号,在原表中从0开始编号,并且最后只输出这几列。 - 注意:判断重复依据的是列的组合,而非某个单列,即在get_data()的列号填写的是哪几个,它们组合起来,只有这行数据在新表中有相同值,才拒绝它,如果只是其中部分值相同,但仍有不同的部分,则新表接受它。
上代码:
以某一列去重:
'''
这个去重,可以做到:1、去除完全一致的重复行;2、依据某一列去重。
无法做到依据多列的组合来去重。
'''
import pandas as pd
# 直接从桌面读取指定的Excel中第一个sheet的数据
data = pd.DataFrame(pd.read_excel('C:/Users/Administrator/Desktop/表的名字.xlsx'))
# 查看读取数据内容前三行
print(data[:3])
# 查看是否有重复行(完全一致的重复行),结果是T/F,本次只输出3行
re_row = data.duplicated()
print(re_row[:3])
# 查看去除重复行之后的数据
# no_re_row = data.drop_duplicates()
# print(no_re_row)
# 查看基于“品名”列去除重复行的结果前三行
wp = data.drop_duplicates(['品名'])
print(wp[:3])
'''
将去除重复行的数据输出到excel表中
若两行有个别单元格不一致,两行均保留
'''
no_re_row.to_excel("C:/Users/Administrator/Desktop/表的名字(去掉完全一致的重复行).xlsx",index=False)
'''
将基于“品名”列去除重复行的数据输出到excel表中
品名一致、但其他内容不同的行均被删掉
'''
wp.to_excel("C:/Users/Administrator/Desktop/表的名字(基于品名去重).xlsx",index=False)
以多列去重:
'''
这个去重能够做到:依据多列的组合来去重,
但是,输出的结果也只剩下组合中的几列,无法把其他列也带上
'''
import pandas as pd
from functools import reduce
#获取数据
def get_data(filename):
# 直接从文件夹中读取表格中的数据,表格已经提前存放到文件夹
data = pd.DataFrame(pd.read_excel('C:/Users/Administrator/Desktop/'+filename,header=None))
# print(data[:3])
print('*' * 16, '共获取到', data.shape[0], '行数据(未去重,含表头)', '*' * 16)#查看原始数据有多少行
data_124=data.iloc[:,[4,5,6,7,8,9,10,11,12]]#
return(data_124)
#开始去重
***
下面把get_data()得到的数据变成列表形式,并且逐个去添加到另一个空列表
indf_li,在这个过程中,会去查待添加的值是否已存在于indf_li,如果已存
在,就不添加这个值,如果不存在,才能添加,以此去重。
***
def qu_chong(indf):
indf_list = indf.values.tolist()
func = lambda x, y: x if y in x else x + [y]
indf_li = reduce(func, [[], ] + indf_list)
print('*' * 65)
print('*' * 16, '共获取到', len(indf_li), '行数据(已去重,含表头)', '*' * 16)#查看去重之后,数据有多少行
print(indf_li[:3])
indf_li=pd.DataFrame(indf_li)
return(indf_li)
def output(in_df):
in_df.to_excel('C:/Users/Administrator/Desktop/data_124去重.xlsx', index=False, header=False)#这里的输出表名称可改
if __name__=='__main__':
output(qu_chong(get_data('表名.xlsx')))
以上。