Pandas去重,保留首尾两个重复值,是否可行?

7

我有一个数据框,我需要删除所有重复的行,但是我需要保留第一行和最后一行。

例如:

1      0

2     0

3     0

4     0

输出:

1     0

4     0

我尝试了df.column.drop_duplicates(keep=("first","last")),但它不起作用,返回了以下结果:

ValueError: keep必须是"first"、"last"或False

有人知道解决方法吗?

谢谢

3个回答

14
你可以使用pandas.concat函数创建一个包含第一个和最后一个值的数据框。
pd.concat([
    df['X'].drop_duplicates(keep='first'),
    df['X'].drop_duplicates(keep='last'),
])

3

你不能删除第一个和最后一个,所以技巧是将第一个和最后一个的数据帧连接起来。

当你连接时,需要处理非重复项的副本。因此,只需在第二个数据框中连接唯一索引即可。 (不确定合并/连接是否更好?)

import pandas as pd

d = {1:0,2:0,10:1, 3:0,4:0}

df = pd.DataFrame.from_dict(d, orient='index', columns=['cnt'])
print(df)

    cnt
1     0
2     0
10    1
3     0
4     0

接着做这个:

d1 = df.drop_duplicates(keep=("first"))
d2 = df.drop_duplicates(keep=("last"))
d3 = pd.concat([d1,d2.loc[set(d2.index) - set(d1.index)]])
d3
Out[60]:
cnt
1   0
10  1
4   0

2

在名为column的列上使用groupby,然后重新索引。如果您想检查多个列中是否存在重复值,可以扩展您在groupby中包含的列。

df = pd.DataFrame({'column':[0,0,0,0]})

输入:

   column
0       0
1       0
2       0
3       0

df.groupby('column', as_index=False).apply(lambda x: x if len(x)==1 else x.iloc[[0, -1]]).reset_index(level=0, drop=True)

输出:

   column
0       0
3       0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接