【问题标题】:finding rows with one difference in DataFrame在 DataFrame 中查找具有一个差异的行
【发布时间】:2018-11-23 00:45:28
【问题描述】:

我有一个数据集,其中许多行几乎相同,这意味着它们对于除 C 列之外的所有字段具有相同的值。

    A    B         C     D ..... Z
0    50  'Ohio'   'Rep'  3       45
1    50  'Ohio'   'Dem'  3       45
2    40  'Kansas' 'Dem'  34      1
3    30  'Kansas' 'Dem'  45      2
4    55  'Texas'  'Rep'  2       7
....
38   55  'Texas'  'Dem'  2       7

我想识别除 C 列外所有相同的行,但在 C 列内我只想找到“Rep”和“Dem”的组合。所以我不希望列 C 的 2 行相同,例如 'Rep' 和 'Rep'。

     A    B         C   D ......Z
0    50  'Ohio'   'Rep'  3       45
1    50  'Ohio'   'Dem'  3       45
4    55  'Texas'  'Rep'  2       7
38   55  'Texas'  'Dem'  2       7

我在所有列(除了 C)上都使用了重复的方法,它提供了所有相同的行。但是,它不会导致重复,即每个带有“Rep”的重复行都恰好有一个带有“Dem”的重复行。

【问题讨论】:

    标签: pandas dataframe duplicates


    【解决方案1】:

    通过difference 列出所有没有C 的列,然后sort_values 每列C 并将其转换为tuples 每组。最后join 为原始,通过Rep,Dem 比较并通过boolean indexing 过滤:

    cols = df.columns.difference(['C']).tolist()
    
    s = df.sort_values('C').groupby(cols)['C'].apply(tuple).rename('m') == ('Dem','Rep')
    df = df[df.join(s, on=cols)['m']]
    

    另一种解决方案是通过sets 进行比较,但如果可能的话,因为像Rep,Dem,Dem 这样的每个组有多个相同的值可能是size 的链条件:

    g = df.groupby(cols)['C']
    m1 = g.transform('size') == 2
    m2 = g.transform(lambda x: set(x) == set(['Rep','Dem']))
    
    df = df[m1 & m2]
    

    print (df)
         A        B    C  D   Z
    0   50   'Ohio'  Rep  3  45
    1   50   'Ohio'  Dem  3  45
    4   55  'Texas'  Rep  2   7
    38  55  'Texas'  Dem  2   7
    

    【讨论】:

      【解决方案2】:

      您可以使用 duplicated 和参数 keepto False 为已删除列 c 的重复行创建掩码,并使用 isin 过滤其中包含任何 ['Rep','Dem'] 的行:

      mask = df.drop(['C'], axis = 1).duplicated(keep=False)
      df[mask][df['C'].isin(['Rep','Dem'])].drop_duplicates()
      
            A        B      C  D   Z
      0  50   'Ohio'  'Rep'  3  45
      1  50   'Ohio'  'Dem'  3  45
      4  55  'Texas'  'Rep'  2   7
      5  55  'Texas'  'Dem'  2   7
      

      【讨论】:

      • isin 不能在这里使用,因为它同时选择了 'Rep' 和 'Rep'
      • 是的。我想最后添加drop_duplicates() 可以解决只有RepRepin c的情况?
      • 据我了解,@Mike 只想要相同的行,但列 c 除外,其中无法找到 RepDem 的两个实例,每个实例只有一个。所以我认为添加drop_duplicates应该可以解决它。感谢您指出!
      • OP需要I would like to identify all rows that are identical except for column C, but within column C I only want to to find combinations of 'Rep' and 'Dem'. So I don't want 2 identical rows with column C for instance being 'Rep' and 'Rep'
      • 谢谢大家。我只想要他们,如果每个“Rep”还有一个“Dem”。当前的解决方案还可以找到具有 2 'Dem' 或 2 'Rep' 的行
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2010-09-19
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      相关资源
      最近更新 更多