Python 数据排序和删除重复项

Python 数据排序和删除重复项,python,pandas,dataframe,Python,Pandas,Dataframe,我有数据框 df1 我正在寻找作为输出 ec em p_x p_y 0 22 aa 47 nan 1 67 bb 92 40 2 67 bb 92 56 对于特定的ec和em列,我想删除基于p_x和p_y列的重复值。请让我知道如何才能做到这一点 或者即使我可以像这样重新订购df1 ec em p_x p_y 0 22 aa 44 44 1 22 aa 45 45 2 22 aa 47 nan 3 67

我有数据框

df1

我正在寻找作为输出

   ec  em  p_x  p_y
0 22  aa   47    nan
1 67  bb   92   40
2 67  bb   92   56

对于特定的ec和em列,我想删除基于p_x和p_y列的重复值。请让我知道如何才能做到这一点

或者即使我可以像这样重新订购df1

   ec  em  p_x  p_y
0 22  aa   44    44
1 22  aa   45    45
2 22  aa   47    nan
3 67  bb   56    56
4 67  bb   92    92
5 67  bb   92    40
6 67  bb   92    56
7 82  tt   23    23
8 82  tt   23    23
9 82  tt   12    12
我可以使用df1[~df1['p_x']==df1['p_y']]
并实现期望的结果

以下是解决您问题的熊猫代码:

import numpy as np

conditions = [
    (df['p_x'].isna() == False) & (df['p_y'].isna() == False),
    (df['p_x'].isna() == False) & (df['p_y'].isna() == True),
    (df['p_x'].isna() == True) & (df['p_y'].isna() == False)
]
choices = [df['p_x'] * df['p_y'], df['p_x'], df['p_y']]
df['flag'] = np.select(conditions, choices, default='black')
df = df.drop_duplicates(subset=["flag"], keep = False).drop(columns = ["flag"])

让我知道这是否有助于您

您能解释您的预期输出吗?您必须进一步解释“重复”的确切含义,因为您的预期输出中有许多重复项。为什么您的输出不包含82 tt 23 12和82 tt 23 23?它们是另一对ec和em的最大p_x的p_y的唯一值。我想删除重复值。我尝试使用df2=df1[~(df1['p_x']==df1['p_y']),但这不起作用,因为p_x和p_y列的排序/顺序不同。我已经回答了,但我也感到困惑。不应该
df.loc[~df['p_x','p_y']].agg(frozenset,1).复制(keep=False)]
就足够了吗?感谢Ankit提供的解决方案。。。这对我来说是数值的。但当我使用相同的代码时,p_x和p_y列有字母数字值,它给出了与字符串相关的错误。一般解决方案有一个变化,我明天将更新相同的。
import numpy as np

conditions = [
    (df['p_x'].isna() == False) & (df['p_y'].isna() == False),
    (df['p_x'].isna() == False) & (df['p_y'].isna() == True),
    (df['p_x'].isna() == True) & (df['p_y'].isna() == False)
]
choices = [df['p_x'] * df['p_y'], df['p_x'], df['p_y']]
df['flag'] = np.select(conditions, choices, default='black')
df = df.drop_duplicates(subset=["flag"], keep = False).drop(columns = ["flag"])