首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   qazwsxkevin · 6 天前 · 402 次点击

    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 回复  |  直到 2019-08-13 20:18:44 +08:00
        1
    wqzjk393   6 天前
    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)

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

    @cigarzh 你对问题有了解的话,就不会这么说了。
        6
    cigarzh   6 天前 via iPhone
    @qazwsxkevin #5 columns=[“ a ”, “ b ”, “ c ”, “ d ”] 不就 abc 重复的里留下 d==20 的吗 搞个 duplicate(abc)的 boolean series 搞个 d!=20 的 boolean series 两个 series 做 and 取反再丢 df.loc 里不就完了吗
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2656 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 00:47 · PVG 08:47 · LAX 17:47 · JFK 20:47
    ♥ Do have faith in what you're doing.