【问题标题】:How can I drop consecutive row duplicates with condition of a column? [duplicate]如何删除具有列条件的连续行重复项? [复制]
【发布时间】:2019-12-19 11:33:09
【问题描述】:

This post 对获得我想做的事情的基础非常有帮助,但是,我不知道如何到达终点线。

我有大型数据框(大约 10k 行),前几行看起来像我将称之为 df_a 的内容:

zone  | value   
0     | 12
1     | 12
2       99
3       12
0       12
1       12
2       12
3       99

但是,我希望根据区域的条件在“值”中删除连续重复项。例如,在上面的 sn-p 中,我希望在 zone = 1 时删除第二个“12”。所以我最终得到:

zone  | value   
0     | 12
1     | 12
2       99
3       12
2       12
3       99

我最初的想法是在区域列表中使用循环,根据区域名称自动为每个创建的区域创建新变量,然后运行我的 drop 重复代码(基于 this answer。但是,这并不工作:

data_category_range = df_a['zone'].unique()
data_category_range = data_category_range.tolist()

for i,value in enumerate(data_category_range):
    data_category_range['zone_{}'.format(i)] = df_a[df_a['zone'] == value]

   # de-duplicate
   cols = ["zone","value"]
   de_dup = df_a[cols].loc[(df_a[cols].shift() != df_a[cols]).any(axis=1)]

(这个循环在另一个循环中,它将遍历具有不同“区域”值的数据帧,因此变量需要是动态的 - 对替代方案开放,因为我理解这不是最佳实践)。

谢谢!

【问题讨论】:

    标签: python-3.x pandas loops


    【解决方案1】:

    您可以使用drop_duplicates

    import pandas as pd
    
    data = pd.DataFrame(
        {"zone": [0, 1, 2, 3, 0, 1, 2, 3], "value": [12, 12, 99, 12, 12, 12, 12, 99]}
    )
    data.drop_duplicates(["zone", "value"])
    

    这会给你

    |    |   zone |   value |
    |---:|-------:|--------:|
    |  0 |      0 |      12 |
    |  1 |      1 |      12 |
    |  2 |      2 |      99 |
    |  3 |      3 |      12 |
    |  6 |      2 |      12 |
    |  7 |      3 |      99 |
    

    【讨论】:

    • 抱歉,我提出了一个措辞不当的问题,因为实际的数据集要大得多(超过 10k 行),而且我理解提议的 drop_duplicates 只会保留唯一值?虽然我的目标是删除 consecutive 重复项(在我的数据集中,这表示没有更改,但仍会记录下来)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-01-02
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多