【问题标题】:How to select duplicate rows with pandas?如何用熊猫选择重复的行?
【发布时间】:2016-12-08 15:27:38
【问题描述】:

我有一个这样的数据框:

import pandas as pd
dic = {'A':[100,200,250,300],
       'B':['ci','ci','po','pa'],
       'C':['s','t','p','w']}
df = pd.DataFrame(dic)

我的目标是将行分隔为 2 个数据帧:

  • df1 = 包含沿B 列不重复值的所有行(非队列行)。
  • df2 = 只包含自己重复的行。

结果应该是这样的:

df1 =      A  B C         df2 =     A  B C
      0  250 po p               0  100 ci s 
      1  300 pa w               1  250 ci t

注意:

  • 数据框通常可能非常大,并且有许多在 B 列中重复的值,因此答案应尽可能通用
    • 如果没有重复,df2 应该是空的!所有结果都应该在df1中

【问题讨论】:

    标签: python pandas dataframe subtraction divide


    【解决方案1】:

    您可以使用Series.duplicated 和参数keep=False 为所有重复项创建掩码,然后使用boolean indexing~ 反转mask

    mask = df.B.duplicated(keep=False)
    print (mask)
    0     True
    1     True
    2    False
    3    False
    Name: B, dtype: bool
    
    print (df[mask])
         A   B  C
    0  100  ci  s
    1  200  ci  t
    
    print (df[~mask])
         A   B  C
    2  250  po  p
    3  300  pa  w
    

    【讨论】:

    • 答案很好,但不够通用,因为如果没有重复,我会得到 df[mask] 完整。我会更新问题。
    • 我不明白您对这个答案有什么问题,即使查看您对原始问题的更新
    • @FedericoGentile - 你认为测试数据框是否为空? if df2.empty: print ('empty') else: print ('not empty')
    • 没问题,我已经找到了我的问题......答案很完美......我只是用另一个名字调用了一个变量,结果很奇怪
    • @Superdooperhero - 好的,那么 df.B.duplicated(keep=False) & df.B.notna() 应该可以工作了
    猜你喜欢
    • 2021-05-18
    • 2020-08-01
    • 2019-09-22
    • 2020-12-23
    • 2021-03-06
    • 2021-11-04
    • 1970-01-01
    • 2018-06-06
    • 2013-02-03
    相关资源
    最近更新 更多