【问题标题】:How to drop rows with duplicates column values and the number of columns are not always fixed?如何删除具有重复列值的行并且列数并不总是固定的?
【发布时间】:2021-09-25 05:58:48
【问题描述】:

我有一个数据框,该数据框中的列可以是任意数字(2-50)。例如,它是 2 列,如下所示。我想删除 site1 和 site2 相同的行。

df = pd.DataFrame([[507814, 501972], [529389, 529389], [508110, 508161]], columns = ['site1', 'site2'])

我想删除列值与预期输出类似的行:

df[df["site1"] != df["site2"]]

这可以在这一行完成,但由于我没有固定的列数,而且这部分在循环内,我需要一种最快的方法来做到这一点

提前感谢您的帮助。

谢谢。

【问题讨论】:

    标签: python python-3.x pandas dataframe conditional-statements


    【解决方案1】:

    使用您的示例,这将过滤site1 == site2 所在的列:

    # first option
    df[~df.apply(lambda x: x["site1"] == x["site2"], axis=1)]
    
    # second option
    df.query("site1 != site2")
    

    所有选项都给你:

        site1   site2
    0   507814  501972
    2   508110  508161
    

    【讨论】:

    • 正如我之前所说,我没有固定的列数。以上只是举例。站点的数量可以是任意的,我需要一个通用的解决方案。谢谢
    【解决方案2】:

    如果你有更多的列,你可以使用set() + len():

    x = df[~df.apply(lambda x: len(set(x)), axis=1).eq(1)]
    print(x)
    

    打印:

        site1   site2
    0  507814  501972
    2  508110  508161
    

    编辑:指定列:

    x = df[~df[["site1", "site2"]].apply(lambda x: len(set(x)), axis=1).eq(1)]
    print(x)
    

    打印:

        site1   site2   site3
    0  507814  501972  508284
    2  508110  508161  508098
    

    df 已使用:

        site1   site2   site3
    0  507814  501972  508284
    1  529389  529389  508284
    2  508110  508161  508098
    

    【讨论】:

    • 这适用于站点 2。但如果我尝试执行站点 3,它就无法正常工作。 df = pd.DataFrame([[507814, 501972,508284], [529389, 529389,508284], [508110, 508161,508098]], columns = ['site1', 'site2','site3'])跨度>
    • 我在循环中有很多列。所以我用了这个。 df = df[df.apply(lambda x: len(set(x)), axis=1).eq(site)]。谢谢
    【解决方案3】:

    你可以这样做:

    df = df[df.nunique(axis=1) > 1]
    

    【讨论】:

    • 这适用于站点 2。但如果我尝试执行站点 3,它就无法正常工作。 df = pd.DataFrame([[507814, 501972,508284], [529389, 529389,508284], [508110, 508161,508098]], columns = ['site1', 'site2','site3'])跨度>
    • 你到底想做什么,你想删除所有值都相等的行,还是至少两个值相等的行?
    【解决方案4】:

    这是另一种方式。如果您的所有网站值都是数字,这应该可以工作。

    df.loc[df.diff(axis=1).sum(axis=1).ne(0)]
    

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 2013-01-03
      • 2020-07-08
      • 2019-07-17
      • 2022-08-05
      相关资源
      最近更新 更多