【问题标题】:Pandas remove equivalent rows from dataframe where xy = yxPandas 从数据框中删除等效行,其中 xy = yx
【发布时间】:2023-01-31 21:35:03
【问题描述】:

我是大熊猫的初学者,我遇到了一个小问题。

我想删除 pandas 数据框中的等效条目,它使用重复的列,其中 _x 列和 _y 列通过更改顺序重复数据。

例如,我有以下代码将数据框与自身合并:

import pandas as pd

df = pd.DataFrame([
    ["mary","algebra"],
    ["mary","calculus"],
    ["john","algebra"],
    ["robert","calculus"]
    ],
    columns=["name","class"])

df = pd.merge(df,df,on="class").query("name_x != name_y")

print(df)

输出是这样的:

   name_x     class  name_y
1    mary   algebra    john
2    john   algebra    mary
5    mary  calculus  robert
6  robert  calculus    mary

问题是某些信息重复了,例如,第 1 行和第 2 行是等效的,因为变量 _x 和 _y 的顺序对我的问题无关紧要,我想是否有办法删除等效行并转以前的输出到这个:

   name_x     class  name_y
1    mary   algebra    john
2    mary  calculus  robert

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以将 duplicatedboolean indexing 一起使用:

    #is the pair of names duplicated ?
    m = df.filter(like="name").apply(sorted, axis=1).duplicated()
    
    df = df.loc[m]
    

    输出 :

    print(df)
    
       name_x     class name_y
    2    john   algebra   mary
    6  robert  calculus   mary
    

    【讨论】:

      【解决方案2】:

      这是使用lambda 的可能解决方案:

      df = pd.merge(df,df,on="class").query("name_x != name_y")
      df["pair"] = df[["name_x", "name_y"]].apply(lambda x: tuple(sorted(x)), axis=1)
      df = df.drop_duplicates(subset='pair').drop(columns='pair')
      
      print(df)
      

        name_x     class  name_y
      1   mary   algebra    john
      5   mary  calculus  robert
      

      【讨论】:

        猜你喜欢
        • 2021-12-07
        • 1970-01-01
        • 2021-06-18
        • 2016-07-07
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        相关资源
        最近更新 更多