【问题标题】:Python 3.x pandas how to compare duplicates and drop the rows with the higher values in csv?Python 3.x pandas 如何比较重复项并删除 csv 中具有较高值的​​行?
【发布时间】:2018-04-17 16:45:33
【问题描述】:

您好,我是 python 新手,目前使用的是 python 3.x 版。我有大量需要在 csv 中过滤的数据。我在网上搜索,很多人建议将其加载到 pandas DataFrame 中(完成)。

我的列可以定义为:“ID”、“Name”、“Time”、“Token”、“Text”

我需要在“令牌”下检查是否有任何重复项 - 这可以通过

完成

df = df[df.Token.duplicate(keep=False)]

(如有错误请指正)

但问题是,我需要保留原始行,同时删除其他重复项。为此,我被告知将其与“时间”进行比较。具有最小值的“时间”将是原始的(保留),而丢弃其余的重复项。

例如:

ID 名称时间标记文本

1 |约翰 | 333 |你好 | xxxx

2 |玛丽 | 233 | Hiiii | xxxx

3 |詹姆斯 | 222 |你好 | xxxx

4 |肯 | 555 |你好 | xxxx

期望的输出:

2 |玛丽 | 233 | Hiiii | xxxx

3 |詹姆斯 | 222 |你好 | xxxx

我做了什么:

    ##compare and keep the smaller value
    def dups(df):
       return df[df["Time"] < df["Time"]]

df = df[df.Token.duplicate()].apply(dups)

这大概就是我卡住的地方!任何人都可以帮忙吗?这是我第一次在 python 中编码,任何帮助将不胜感激。

【问题讨论】:

  • df = df.drop_duplicates(subset=['Token'], keep='first')
  • 订单在这里重要吗?如果没有,您可以对 Time... 进行排序,然后保证 drop_duplicates 保留最小的行。
  • @cᴏʟᴅsᴘᴇᴇᴅ Hellooo,谢谢您的快速回复,嗯,但据我所知(我可能错了)keep='first' 保留了第一个条目,但我有一千行和“时间”都是随机记录的,所以第一个条目可能有更高的值,有没有办法比较它(基于他们的“时间”)?所以我可以保留较小的值
  • 就像我提到的,你可以做df = df.sort_values('Time').drop_duplicates('Time', keep='first')

标签: python pandas csv dataframe duplicates


【解决方案1】:

使用sort_values + drop_duplicates:

df = df.sort_values('Time')\
        .drop_duplicates('Token', keep='first').sort_index()
df

   ID  Name  Time  Token  Text
1   2  Mary   233  Hiiii  xxxx
2   3  Jame   222  Hello  xxxx

最后的sort_index 调用将顺序恢复到您的原始数据帧。如果您想检索超出此点的单调递增索引,请致电reset_index

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2015-07-15
    • 2019-12-10
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2020-10-16
    相关资源
    最近更新 更多