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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熊猫删除特殊情况下的副本相关的知识,希望对你有一定的参考价值。

假设我有这个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”。请让我知道如何解决这个问题。谢谢! :)

答案
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
另一答案

略微程序化的方法,但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

以上是关于熊猫删除特殊情况下的副本的主要内容,如果未能解决你的问题,请参考以下文章

大熊猫中的切片和副本有啥区别? [复制]

熊猫视图与副本:文档说“没人知道”?

如果未定义索引操作是返回视图还是副本,熊猫的观点是啥?

从熊猫数据框中的地址中删除分数

熊猫“试图在数据帧的切片副本上设置一个值”

python 熊猫片段