熊猫删除特殊情况下的副本

时间:2018-01-19 01:15:42

标签: python pandas duplicates

假设我有这个df:

Day Id   Value
7   111  a
6   111  a 
5   111  a
4   111  b
3   111  b
2   111  a
1   111  a
6   222  a
5   222  a
4   222  b
3   222  b
2   222  b
1   222  b

我想删除重复项以获得如下结果:(每次值切换时只保留行)

Day Id   Value
5   111  a
3   111  b
1   111  a
5   222  a
1   222  b

我试过了:df = df.drop_duplicates([' Id',' Value'],keep =' last')

Day Id   Value
3   111  b
1   111  a
5   222  a
1   222  b

正如你所看到的,我错过了" 5 111 a"。请让我知道如何解决这个问题。谢谢! :)

2 个答案:

答案 0 :(得分:1)

columns = ['Id','Value']
df[np.any(df[columns].shift(-1) != df[columns], axis=1)]
#    Day   Id Value
#2     5  111     a
#4     3  111     b
#6     1  111     a
#8     5  222     a
#12    1  222     b

答案 1 :(得分:1)

略微程序化的方法,但DYZ仍然令人印象深刻。

df = pd.read_clipboard()
df['flag'] = df['Id'].astype(str) + "|" + df['Value']
df

    Day Id  Value   flag
0   7   111 a   111|a
1   6   111 a   111|a
2   5   111 a   111|a
3   4   111 b   111|b
4   3   111 b   111|b
5   2   111 a   111|a
6   1   111 a   111|a
7   6   222 a   222|a
8   5   222 a   222|a
9   4   222 b   222|b
10  3   222 b   222|b
11  2   222 b   222|b
12  1   222 b   222|b


to_keep = []

for index, row in df.iterrows():
    try:
        next_val = df.iloc[index+1]['flag']        
        if row['flag'] != next_val:
            to_keep.append(row)
    except IndexError:
        to_keep.append(row)

pd.DataFrame.from_records(to_keep)

    Day Id  Value   flag
0   5   111 a   111|a
1   3   111 b   111|b
2   1   111 a   111|a
3   5   222 a   222|a
4   1   222 b   222|b