在特定列中的数据具有某些条件的情况下,删除数据框中的重复行

时间:2019-07-11 21:13:50

标签: python pandas dataframe

我有以下数据框df

Index   time   block   cell
 0       9      25      c1
 1       9      25      c1
 2       33     35      c2
 3       47     4       c1
 4       47     17      c2
 5       100    21      c1
 6       120    21      c1
 7       120    36      c2

要根据时间列删除重复项。但是,有一个条件: -如果两个或两个以上相似时间具有相同的单元格,例如,索引0和索引1具有c1   然后保留任何列。 -如果两个或两个以上相似时间的单元格不同,例如索引3和4以及索引6和7,则保留所有行对应重复的时间

结果数据帧如下:df_result =

Index   time   block   cell
 0       9      25      c1
 2       33     35      c2
 3       47     4       c1
 4       47     17      c2
 5       100    21      c1
 6       120    21      c1
 7       120    36      c2

尝试过  df.drop_duplicates('time')

2 个答案:

答案 0 :(得分:1)

您可以通过将原始DataFrame分为多个类别,然后在每个类别中运行drop_duplicates()来实现。

import pandas as pd

df = pd.DataFrame({'time':[9,9,33,47,47,100,120,120],'block':[25,25,35,4,17,21,21,36],'cell':'c1;c1;c2;c1;c2;c1;c1;c2'.split(';')})

categories = df['cell'].astype('category').unique()
df2 = pd.DataFrame()
for category in categories:
    df2 = pd.concat([df2, df[df['cell'] == category].drop_duplicates(keep='first')])

df2 = df2.sort_index()

这将导致df2

    time  block cell
0     9     25   c1
2    33     35   c2
3    47      4   c1
4    47     17   c2
5   100     21   c1
6   120     21   c1
7   120     36   c2

答案 1 :(得分:0)

您可以按所需列之一进行分组,然后将重复项放在另一列上,如下所示:

df = pd.DataFrame({'time':[9,9,33,47,47,100,120,120],'block':[25,25,35,4,17,21,21,36],'cell': ['c1','c1','c2','c1','c2','c1','c1','c2']})
grouped = df.groupby('time')
final_df = pd.DataFrame({'time':[] ,'block':[],'cell':[]})
for ind, gr in grouped:
    final_df = final_df.append(gr.drop_duplicates("cell"))