在一系列副本中放弃唯一第一个的Pythonic方法是什么?
我有一个数据框:
Group Value
a 0
a 1
a 2
b 6
b 7
b 8
我希望得到以下结果:
Group Value
a 1
a 2
b 7
b 8
drop_duplicates
保留第一个或最后一个项目,具体取决于您的设置方式。我希望删除第一个出现重复的事件并保留其余部分。
答案 0 :(得分:6)
使用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
答案 1 :(得分:2)
If it is unique row , you want to keep it
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
答案 2 :(得分:0)
这不是很好,但应该有效
F = []
for names, frames in df.groupby('Group'):
F.append(frames.sort_values('value').iloc[1:,:])
new_df = pd.concat(F)
答案 3 :(得分:0)
找到第一行的索引并将其与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")