【问题标题】:How to identify the first occurence of duplicate rows in Python pandas Dataframe如何识别 Python pandas Dataframe 中首次出现的重复行
【发布时间】:2013-02-03 20:48:09
【问题描述】:

我有一个 Pandas DataFrame,其中一组列的值重复。例如:

df = pd.DataFrame({'Column1': {0: 1, 1: 2, 2: 3}, 'Column2': {0: 'ABC', 1: 'XYZ', 2: 'ABC'}, 'Column3': {0: 'DEF', 1: 'DEF', 2: 'DEF'}, 'Column4': {0: 10, 1: 40, 2: 10})

In [2]: df
Out[2]: 
   Column1 Column2 Column3  Column4 is_duplicated  dup_index
0        1     ABC     DEF       10         False          0
1        2     XYZ     DEF       40         False          1
2        3     ABC     DEF       10          True          0

第 (1) 行和 (3) 行相同。本质上,第 (3) 行是第 (1) 行的副本。

我正在寻找以下输出:

Is_Duplicate,包含行是否重复[可以通过对dataframe列(Column2,Column3和Column4)使用“duplicated”方法来完成]

Dup_Index重复行的原始索引。

In [3]: df
Out[3]: 
   Column1 Column2 Column3  Column4  Is_Duplicate  Dup_Index
0        1     ABC     DEF       10         False          0
1        2     XYZ     DEF       40         False          1
2        3     ABC     DEF       10          True          0

【问题讨论】:

    标签: python-2.7 dataframe pandas


    【解决方案1】:

    第一列有一个DataFrame方法duplicated

    In [11]: df.duplicated(['Column2', 'Column3', 'Column4'])
    Out[11]: 
    0    False
    1    False
    2     True
    
    In [12]: df['is_duplicated'] = df.duplicated(['Column2', 'Column3', 'Column4'])
    

    要做到第二个,你可以尝试这样的事情:

    In [13]: g = df.groupby(['Column2', 'Column3', 'Column4'])
    
    In [14]: df1 = df.set_index(['Column2', 'Column3', 'Column4'])
    
    In [15]: df1.index.map(lambda ind: g.indices[ind][0])
    Out[15]: array([0, 1, 0])
    
    In [16]: df['dup_index'] = df1.index.map(lambda ind: g.indices[ind][0])
    
    In [17]: df
    Out[17]: 
       Column1 Column2 Column3  Column4 is_duplicated  dup_index
    0        1     ABC     DEF       10         False          0
    1        2     XYZ     DEF       40         False          1
    2        3     ABC     DEF       10          True          0
    

    【讨论】:

    • 谢谢,非常优雅的解决方案。
    • 谢谢你,@AndyHayden。我正在寻找这样的东西来解决我的问题:stackoverflow.com/questions/49103097/…。除了将 dup_index 设置为原始出现之外,有没有办法获取最后一次出现并在那里设置列值?感谢您的帮助。
    • 谢谢,使用了 df1.index.map(lambda ind: g.indices[ind][len(g.indices[ind])-1])
    • @Alice 很高兴你把它整理好了。很抱歉我之前没有提供帮助:我确实看过这个问题,但当时无法完全理解/深入了解。
    • 感谢@AndyHayden 的指点。还有一个问题,除了最后一次出现的行之外,任何方式来空白或不填充“dup-index”列中的所有条目。因此,除了最后一次出现的行之外,没有任何“dup_index”列具有任何值。还作为一个新问题发布:stackoverflow.com/questions/49188701/…
    【解决方案2】:

    假设您的数据框存储在df

    您可以使用groupby 获取数据框的非重复行。这里我们必须忽略不属于数据的 Column1:

    df_nodup = df.groupby(by=['Column2', 'Column3', 'Column4']).first()
    

    然后,您可以使用 merge 函数将这个新数据框与原始数据框合并:

    df = df.merge(df_nodup, left_on=['Column2', 'Column3', 'Column4'], right_index=True, suffixes=('', '_dupindex'))
    

    您最终可以使用合并到数据框中的 _dupindex 列来进行简单的数学运算以添加所需的列:

    df['Is_Duplicate'] = df['Column1']!=df['Column1_dupindex']
    df['Dup_Index'] = None
    df['Dup_Index'] = df['Dup_Index'].where(df['Column1_dupindex']==df['Column1'], df['Column1_dupindex'])
    del df['Column1_dupindex']
    

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多