推荐学习书目
› 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
qazwsxkevin
V2EX  ›  Python

请教,这种情况的 pandas 多条件去重复行是 pd 内置方法来搞,还是设计算法来处理?另请教重建索引

  •  
  •   qazwsxkevin · Aug 13, 2019 · 2468 views
    This topic created in 2643 days ago, the information mentioned may be changed or developed.

    df 是这样子的:

    rubDF = pd.DataFrame(columns=["corp", "stype", "mktime", "serNum", "status", "A","B","C","D"])
    

    打算去重,想法: corp,mktime,status 相同的行,只保留 A 内容为"20kg"的 看了文档,似乎 drop_duplicates 选项比较简单,这种情况是不是只能用 python 设计算法操作? 不知道是否 pandas 有妖招可以解决,pandas 内置方法始终比 python 算法来操作的快,毕竟数据有 80 多 W 行

    另外请教一个索引重建问题:

    df 简单地去重了以后:

    rubDF .drop_duplicates(subset=None,keep='first',inplace=True)
    

    index 的值是默认 df 创建的,并没有单独地去做或者指定一列索引,

    如果要简单地重建索引,以 mktime 降序,应该是怎么样操作?

    6 replies  •  2019-08-13 20:18:44 +08:00
    wqzjk393
    wqzjk393
    Aug 13, 2019
    1
    data = [["corp1", "stype1", "mktime1", "serNum1", "status1", "20kg","B1","C1","D1"],
    ["corp1", "stype1", "mktime1", "serNum2", "status3", "20kg","B1","C1","D1"],
    ["corp1", "stype1", "mktime1", "serNum2", "status5", "30kg","B1","C1","D1"],
    ["corp1", "stype1", "mktime1", "serNum7", "status3", "40kg","B1","C1","D1"],
    ["corp2", "stype3", "mktime4", "serNum4", "status9", "A1","B1","C1","D1"],
    ["corp2", "stype1", "mktime67", "serNum2", "status4", "20kg","B1","C1","D1"]]
    rubDF = pd.DataFrame(data,columns=["corp", "stype", "mktime", "serNum", "status", "A","B","C","D"])
    rubDF['sortindex'] = rubDF.apply(lambda x:1 if x.A == '20kg' else 2,axis=1)
    rubDF.sort_values(by=['sortindex'],ascending=True,inplace=True)
    rubDF.drop_duplicates(['A'],keep='first',inplace=True)
    print(rubDF)

    不知道是不是符合需求
    wqzjk393
    wqzjk393
    Aug 13, 2019
    2
    哦错了,导数第二行改一下:rubDF.drop_duplicates(["corp", "stype", "mktime"],keep='first',inplace=True)
    wqzjk393
    wqzjk393
    Aug 13, 2019
    3
    想法: corp,mktime,status 相同的行,只保留 A 内容为"20kg"的。所以思路就是先排序让 20kg 作为排序后最一个,然后用 drorduplicates ( [corp,mktime,status ],keep=first )保留[corp,mktime,status ]相同时的第一个值。那排序就简单了,自己按需要写个 map 就可以了
    cigarzh
    cigarzh
    Aug 13, 2019 via iPhone
    4
    连文档都懒得翻了吗……
    qazwsxkevin
    qazwsxkevin
    OP
    Aug 13, 2019
    5
    @wqzjk393 好思路,但估计会很耗时。。。

    @cigarzh 你对问题有了解的话,就不会这么说了。
    cigarzh
    cigarzh
    Aug 13, 2019 via iPhone
    6
    @qazwsxkevin #5 columns=[“ a ”, “ b ”, “ c ”, “ d ”] 不就 abc 重复的里留下 d==20 的吗 搞个 duplicate(abc)的 boolean series 搞个 d!=20 的 boolean series 两个 series 做 and 取反再丢 df.loc 里不就完了吗
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1484 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:39 · PVG 23:39 · LAX 07:39 · JFK 10:39
    ♥ Do have faith in what you're doing.