怎样用python对Excel的一列或几列去重

怎样用python对Excel中的某些列去重?

你好!

需求描述:

  1. 依据某一列去重,结果包含原表所有的列;
  2. 依据某几列去重,结果表只含这几列;
    提供.xlsx格式,输出也要表格。
难点:
  1. 表格数据量大,几万行以上,直接用Excel常常很卡,但有时WPS可以快些,但又因为WPS安装之后不好卸载,不愿用;
  2. 运行时间长,等圈圈转好久;
  3. 没法看到过程;
  4. 有时候依据某一列去重时,Excel仅操作这一列,其他的列原封不动保留,结果会出现“长短腿”,即被去重的列,值的数量明显数量少于其他列。而实际上,我们需要的是,对这一列去重,然后这一列留哪个值,那么与之关联的整行都要留下;
  5. 就是想用python,就是想写个文章emmm。。。
解释:
  1. 本次的表格放在桌面,代码默认表格在桌面,只需输入表格的名称即可(如5月销售表.xlsx)。可以调整表格的存储位置,在获取数据的方法get_data()中更改路径即可;
  2. 输出表格的位置同样在桌面,可以更改输出表的名称,在输出函数output()中更改;
  3. get_data()中,下面一行代码里的列号是需要根据自己的需求调整的:
    data_124=data.iloc[:,[列号1,列号2,列号3,…]]
    列表中的数字代表去重时依据的列号,在原表中从0开始编号,并且最后只输出这几列。
  4. 注意:判断重复依据的是列的组合,而非某个单列,即在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')))

以上。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值