【问题标题】:Find duplicated rows and replace value in one column查找重复行并替换一列中的值
【发布时间】:2021-08-07 15:38:43
【问题描述】:

我有一个如下所示的 df:

x    y   c   v   
KRY  2   T1  23
KRY  2   T1  23
KRD  3   T2  24
KRD  3   T2  24
KRD  3   T2  24
KRO  4   T3  245
KRO  4   T3  245
KRO  4   T3  13

现在我必须找到重复的行(基于 x、y、c 列)并将 v 列中的值替换为 0。所以应该是这样的:

x    y   c   v   
KRY  2   T1  23
KRY  2   T1  0
KRD  3   T2  24
KRD  3   T2  0
KRD  3   T2  0
KRO  4   T3  245
KRO  4   T3  0
KRO  4   T3  13

我尝试先定位行,然后它们使用了替换功能,但它不起作用。我的代码如下:

df[df.duplicated(subset=['x','y','c','v'])].replace(df["v"], "0")

您知道我该如何解决吗?感谢您的帮助

【问题讨论】:

  • 为什么你在最后一行得到KRO 4 T3 13而不是KRO 4 T3 0 ...如果你真的在工作based on columns x, y, c

标签: python pandas dataframe replace duplicates


【解决方案1】:

你也可以使用numpy.where:

import numpy as np

df['v'] = np.where(~df.duplicated(), df['v'], 0)

输出:

      x  y   c    v
0   KRY  2  T1   23
1   KRY  2  T1    0
2   KRD  3  T2   24
3   KRD  3  T2    0
4   KRD  3  T2    0
5   KRO  4  T3  245
6   KRO  4  T3    0
7   KRO  4  T3   13

【讨论】:

    【解决方案2】:

    您真的很接近 - 将匹配值 v 设置为 0 值和 DataFrame.loc

    df.loc[df.duplicated(subset=['x','y','c','v']), 'v'] = 0
    print (df)
         x  y   c    v
    0  KRY  2  T1   23
    1  KRY  2  T1    0
    2  KRD  3  T2   24
    3  KRD  3  T2    0
    4  KRD  3  T2    0
    5  KRO  4  T3  245
    6  KRO  4  T3    0
    7  KRO  4  T3   13
    

    【讨论】:

    • 您对代码中的规范的重视程度是否高于普通英语中的规范? ;)
    • @Wolf - 不确定是否理解,有 3 列重复,所有没有第一列的欺骗都设置为 0
    • 我的意思是你的解决方案在任何情况下都是有效的,微小的改变在这里不会有很大的不同。对我来说,在 OP 中有两个相互矛盾的规范似乎有点“丑陋”。
    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多