V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kevinfk2
V2EX  ›  Python

Python 小白又来求助啦,有关 excel 条件去重的问题。求大佬解答。

  •  
  •   kevinfk2 · 2020-12-25 11:20:51 +08:00 · 1890 次点击
    这是一个创建于 1459 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有一个 excel 表格,如图 https://imgur.com/DhZDVZK

    需求:

    A 列出现了重复的数据,需要去除重复的行。

    需要根据 date2 这列数据判断,保留日期比较新的一行。

    如果 date2 数据为空,要根据 date1 数据判断,保留日期比较新的一行。

    最后将去重的表格保存到原 excel 的新 sheet


    目前状况:

    我只会根据一列去重。代码如下
    # -*- coding: utf-8 -*-
    from __future__ import print_function

    import pandas as pd

    # 读取 Excel 中 Sheet1 中的数据
    data = pd.DataFrame(pd.read_excel(r'C:\Users\140082\Desktop\去重测试.xlsx', 'Sheet1'))

    # 查看基于[name]列去除重复行的数据
    wp = data.drop_duplicates(['name'])
    print(wp)

    请问我要怎么完成需求啊,大佬求解答!
    9 条回复    2020-12-25 15:53:25 +08:00
    krixaar
        1
    krixaar  
       2020-12-25 11:38:08 +08:00   ❤️ 1
    这种小事不用 Python,Excel 里新建一辅助列,内容是如果 date2 为空则为 date1 否则 date2 (=if(isblank 或者 len=0 自己按需挑, C2, D2)),date3 降序,数据--删除重复值--A 列,确定,删掉辅助列。
    删除重复值会保留最上面的行,所以降序排列后剩下的就是最新行。
    非得用 Python 或者 SQL 思路同上。
    lpts007
        2
    lpts007  
       2020-12-25 11:41:16 +08:00   ❤️ 1
    sort by date2, date1
    drop keep=last
    kevinfk2
        3
    kevinfk2  
    OP
       2020-12-25 11:44:43 +08:00
    @krixaar 要处理的数据表太多了,非常卡,所以想用 python 做
    kevinfk2
        4
    kevinfk2  
    OP
       2020-12-25 11:51:02 +08:00
    @lpts007 不太理解
    factoid
        5
    factoid  
       2020-12-25 12:46:36 +08:00 via iPhone
    @lpts007 厉害了,我只能想到用 apply 先去构建布尔值,然后取值
    factoid
        6
    factoid  
       2020-12-25 12:49:24 +08:00 via iPhone
    @kevinfk2 他的意思是先按照 date2,date1 排序,有个 df.sortxxxxx 啥的函数,然后 drop_duplicates([‘name’],keep=last)
    wysnylc
        7
    wysnylc  
       2020-12-25 14:22:23 +08:00
    你以为 python 能有多高性能啊,都是单线程谁也别瞧不起谁
    我站 excel
    TEwrc
        8
    TEwrc  
       2020-12-25 15:31:23 +08:00   ❤️ 1
    写了半天好像对了:

    import csv
    from itertools import tee, takewhile, islice

    result = []
    with open('test.csv', 'r') as f:
    info1, info2, info3 = tee(islice(csv.reader(f), 1, None), 3)
    sorted_by_date1 = sorted(info1, key=lambda x: x[2], reverse=True)
    sorted_by_date2 = takewhile(lambda x: x[3], sorted(info2, key=lambda x: x[3], reverse=True))
    for j in sorted_by_date2:
    if j[0] not in [i[0] for i in result]:
    result.append(j)
    for k in sorted_by_date1:
    if k[0] not in [i[0] for i in result]:
    result.append(k)
    print(result)
    kevinfk2
        9
    kevinfk2  
    OP
       2020-12-25 15:53:25 +08:00
    @TEwrc 辛苦大佬了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1685 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 16:37 · PVG 00:37 · LAX 08:37 · JFK 11:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.