Python Pandas 删除系列中的第一个重复项

4
什么是最符合Python风格的方法来删除一系列重复元素中的第一个?
我有一个数据框:
Group    Value
  a        0
  a        1
  a        2
  b        6
  b        7
  b        8

and I want the following result:

Group    Value
  a        1
  a        2
  b        7
  b        8

drop_duplicates函数会根据设置的参数保留第一个或最后一个重复项。我希望删除第一次出现的重复项并保留其余重复项。


如果没有重复项,您希望发生什么? - DSM
如果没有重复项,请保留该行。 - Windstorm1981
你关心连续性吗?在b后面可能会有第二组a,你是否想保留除第一个以外的所有内容,或者它们将被视为a的重复并全部保留? - DSM
4个回答

9
使用 duplicated() 创建一个布尔掩码,并基于此进行过滤:
df[df.Group.duplicated()]

#Group  Value
#1   a      1
#2   a      2
#4   b      7
#5   b      8

duplicated默认会将重复项的第一个出现视为True:

df.Group.duplicated()

#0    False
#1     True
#2     True
#3    False
#4     True
#5     True
#Name: Group, dtype: bool

为了保持每个组只有一行的情况(这样效率就不会那么高):
df[df.Group.duplicated() | df.Group.groupby(df.Group).transform('count').eq(1)]

# Group Value
#1    a     1
#2    a     2
#4    b     7
#5    b     8

或者:

df[df.Group.groupby(df.Group).transform(lambda x: (x.size == 1) | x.duplicated())]
# Group  Value
#1    a      1
#2    a      2
#4    b      7
#5    b      8

这里有些问题,如果它是唯一的,它也会被删除。你可以尝试添加一行 c 11。 - BENY
@Wen 是的。已更新包含边缘情况。 - Psidom

2

如果是唯一的行,您想保留它

df.groupby('Group').Value.apply(lambda x : x.iloc[1:] if len(x)>1 else x).reset_index('Group')
Out[144]: 
  Group  Value
1     a      1
2     a      2
4     b      7
5     b      8
6     c     11

数据输入

df
Out[138]: 
  Group  Value
0     a      0
1     a      1
2     a      2
3     b      6
4     b      7
5     b      8
6     c     11

感谢您在回答开头提供的提示。我也了解了您如何选择组! - Tai

1
找到第一行的索引并使用drop删除它。感谢Wen在答案中提醒我们应该保留没有重复项的行,并且我从他/她选择具有重复项的组的方法中学到了东西。
grouped = df.reset_index().groupby("Group")["index", "Value"]
first_rows = grouped.apply(lambda x: x.iloc[0] if len(x) > 1 else None).dropna()
index_first_rows = first_rows["index"]
df.drop(index_first_rows, axis="index")

0

这不太好看,但应该能用

F = []
for names, frames in df.groupby('Group'):

    F.append(frames.sort_values('value').iloc[1:,:])

new_df = pd.concat(F)

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