【问题标题】:Pandas: Drop duplicate but consecutive rows and keep the first row within group熊猫:删除重复但连续的行并将第一行保留在组内
【发布时间】:2020-11-10 04:48:11
【问题描述】:

我有一个如下的df:

df = pd.DataFrame({
    'ID': ['James', 'James', 'James', 'James',
           'Max', 'Max', 'Max', 'Max', 'Max',
           'Park', 'Park','Park', 'Park',
           'Tom', 'Tom', 'Tom', 'Tom'],
    'From_num': [578, 420, 420, 'Started', 298, 78, 36, 298, 'Started', 28, 28, 311, 'Started', 60, 520, 99, 'Started'],
    'To_num': [96, 578, 578, 420, 36, 298, 78, 36, 298, 112, 112, 28, 311, 150, 60, 520, 99],
    'Date': ['2020-05-12', '2020-02-02', '2020-02-01', '2019-06-18',
             '2019-08-26', '2019-06-20', '2019-01-30', '2018-10-23',
             '2018-08-29', '2020-05-21', '2020-05-20', '2019-11-22',
             '2019-04-12', '2019-10-16', '2019-08-26', '2018-12-11', '2018-10-09']})

我希望只删除每个 ID 组中的 CONSECUTIVE 行(忽略“日期”字段),例如第 1 行和第 2 行具有相同的值,并希望删除第二个副本,与第 9 行和第 9 行相同10,删除第10行,df是这样的:

       ID From_num  To_num        Date
0   James      578      96  2020-05-12
1   James      420     578  2020-02-02
2   James      420     578  2020-02-01 # Drop the this duplicated row (ignore date)
3   James  Started     420  2019-06-18
4     Max      298      36  2019-08-26
5     Max       78     298  2019-06-20
6     Max       36      78  2019-01-30
7     Max      298      36  2018-10-23
8     Max  Started     298  2018-08-29
9    Park       28     112  2020-05-21
10   Park       28     112  2020-05-20 # Drop this duplicate row (ignore date)
11   Park      311      28  2019-11-22
12   Park  Started     311  2019-04-12
13    Tom       60     150  2019-10-16
14    Tom      520      60  2019-08-26
15    Tom       99     520  2018-12-11
16    Tom  Started      99  2018-10-09

我写了循环条件,但它非常冗余且缓慢,我认为可能有更简单的方法可以做到这一点,所以如果你有想法,请提供帮助。万分感谢。预期的结果是这样的,请注意Max中也有两个不连续的值,第4行和第7行,我希望它们都保留:

       ID  From_num  To_num    Date
0   James      578      96  2020-05-12
1   James      420     578  2020-02-02
2   James  Started     420  2019-06-18
3     Max      298      36  2019-08-26
4     Max       78     298  2019-06-20
5     Max       36      78  2019-01-30
6     Max      298      36  2018-10-23
7     Max  Started     298  2018-08-29
8    Park       28     112  2020-05-21
9    Park      311      28  2019-11-22
10   Park  Started     311  2019-04-12
11    Tom       60     150  2019-10-16
12    Tom      520      60  2019-08-26
13    Tom       99     520  2018-12-11
14    Tom  Started      99  2018-10-09

【问题讨论】:

    标签: python pandas loops dataframe duplicates


    【解决方案1】:
    print( df[~(df.iloc[:,0:3] == df.iloc[:,0:3].shift()).all(axis=1)].reset_index(drop=True) )
    

    打印:

           ID From_num  To_num        Date
    0   James      578      96  2020-05-12
    1   James      420     578  2020-02-02
    2   James  Started     420  2019-06-18
    3     Max      298      36  2019-08-26
    4     Max       78     298  2019-06-20
    5     Max       36      78  2019-01-30
    6     Max      298      36  2018-10-23
    7     Max  Started     298  2018-08-29
    8    Park       28     112  2020-05-21
    9    Park      311      28  2019-11-22
    10   Park  Started     311  2019-04-12
    11    Tom       60     150  2019-10-16
    12    Tom      520      60  2019-08-26
    13    Tom       99     520  2018-12-11
    14    Tom  Started      99  2018-10-09
    

    【讨论】:

    • 谢谢@Andrej Kesely,只是想知道 iloc[:, 0:3] 它不包括第三列吗?只有 col 索引从 0 到 2?
    • @JimmyXXLumix 是的,没错。你也可以df.loc[:,'ID':'To_num']
    猜你喜欢
    • 2013-10-28
    • 2011-08-31
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2015-10-26
    • 2016-10-28
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多