【问题标题】:Pandas: drop duplicated rows with same "rounded" values without creating new columnsPandas:删除具有相同“舍入”值的重复行而不创建新列
【发布时间】:2018-09-25 14:06:32
【问题描述】:

我想删除列BC 中的值在四舍五入到小数点后两位相等的重复行

import pandas as pd
df = pd.DataFrame({"A":["f1", "f2", "f3", "f4"], "B":[1.2579,1.2586,1.7223,1], "C":[8.2579,8.2586,12.7223,14.0]})

   A       B        C
0  f1  1.2579   8.2579
1  f2  1.2586   8.2586
2  f3  1.7223  12.7223
3  f4  1.0000  14.0000

这里,行01 在四舍五入后具有相同的值。而不是创建列 B_roundC_round 来删除这样的重复项

df['B_round'] = df['B'].values.round(2)
df['C_round'] = df['C'].values.round(2)
df = df.drop_duplicates(subset=['B_round', 'C_round'], keep='first')

我必须再次删除列

df = df.drop(['B_round', 'C_round'], axis=1)
   A       B        C
0  f1  1.2579   8.2579
2  f3  1.7223  12.7223
3  f4  1.0000  14.0000

因为我的真实数据很大。有没有办法在不创建新列的情况下删除它们?

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    DataFrame.duplicated~boolean indexing 的反相布尔掩码一起使用:

    df = df[~df[['B', 'C']].round(2).duplicated()]
    
    print (df)
        A       B        C
    0  f1  1.2579   8.2579
    2  f3  1.7223  12.7223
    3  f4  1.0000  14.0000
    

    另一种解决方案 - 乘以 100 并将值转换为 integers:

    df = df[~df[['B', 'C']].mul(100).astype(int).duplicated()]
    

    【讨论】:

    • 有趣的是,keep='first' 在这里对.duplicated() 并不重要。它工作得很好。你真快。
    • @Jan - 它是默认值,在 drop_duplicates 中也不重要
    • 确实如此。对不起,我认为'False' 是默认值。谢谢。
    猜你喜欢
    • 2022-01-11
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多