【问题标题】:Pandas remove duplicates with condition from data frame熊猫从数据框中删除带有条件的重复项
【发布时间】:2018-11-09 21:03:09
【问题描述】:

考虑以下数据框:

df = pd.DataFrame({
    'case_id': [1050, 1050, 1050, 1050, 1051, 1051, 1051, 1051],
    'elm_id': [101, 102, 101, 102, 101, 102, 101, 102],
    'cid': [1, 1, 2, 2, 1, 1, 2, 2],
    'fx': [736.1, 16.5, 98.8, 158.5, 272.5, 750.0, 333.4, 104.2],
    'fy': [992.0, 261.3, 798.3, 452.0, 535.9, 838.8, 526.7, 119.4],
    'fz': [428.4, 611.0, 948.3, 523.9, 880.9, 340.3, 890.7, 422.1]})

打印出来的样子是这样的:

--- case_id cid elm_id fx fy fz 0 1050 1 101 736.1 992.0 428.4 1 1050 1 102 16.5 261.3 611.0 2 1050 2 101 98.8 798.3 948.3 3 1050 2 102 158.5 452.0 523.9 4 1051 1 101 272.5 535.9 880.9 5 1051 1 102 750.0 838.8 340.3 6 1051 2 101 333.4 526.7 890.7 7 1051 2 102 104.2 119.4 422.1

我需要删除以下两列subcaseelm_id 中存在重复值的行,并保留cid 最高的行。数据应如下所示:

--- case_id cid elm_id fx fy fz 0 1050 2 101 98.8 798.3 948.3 1 1050 2 102 158.5 452.0 523.9 2 1051 2 101 333.4 526.7 890.7 3 1051 2 102 104.2 119.4 422.1

我是熊猫新手。查看其他类似问题,我尝试使用.groupby()max(),如下所示:df2 = df.groupby(['case_id', 'elm_id']).max()['cid'].reset_index()。但是我丢失了我的专栏fxfyfz。我觉得我很接近了,我只是不知道下一步该往哪里看。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你需要sort_values + drop_duplicates:

    df.sort_values('cid', ascending=False).drop_duplicates(['case_id', 'elm_id'])
    
       case_id  cid  elm_id     fx     fy     fz
    2     1050    2     101   98.8  798.3  948.3
    3     1050    2     102  158.5  452.0  523.9
    6     1051    2     101  333.4  526.7  890.7
    7     1051    2     102  104.2  119.4  422.1
    

    【讨论】:

    • 这看起来很有希望。但是,我使用的 pandas 0.15.2 没有方法 sort_values。我不确定是否可以在工作防火墙后面升级我的 pandas 版本。现在正在研究它......
    • @twegner 尝试将sort_values 替换为df.sort('cid', axis=1, ascending=False)
    • raise ValueError('When sorting by column, axis must be 0 (rows)。因此更改为axis=0 使其工作。谢谢!
    • @twegner 这太愚蠢了。现在我知道他们为什么放弃 API 了,哈哈。
    【解决方案2】:

    另一种方法:

    df[(df.duplicated(subset=['subcase','elm_id']))&(df['cid']>1)]
    
       case_id  cid  elm_id     fx     fy     fz
    2     1050    2     101   98.8  798.3  948.3
    3     1050    2     102  158.5  452.0  523.9
    6     1051    2     101  333.4  526.7  890.7
    7     1051    2     102  104.2  119.4  422.1
    

    【讨论】:

    • 仅有效,因为 cid 在这里采用两个值:1 和 2。一般来说不是一个好方法。
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2017-10-04
    • 2020-03-23
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    相关资源
    最近更新 更多