Python是一系列副本中的第一个
在一系列复制品中,删除第一个复制品的最简单的方法是什么 我有一个数据帧:Python是一系列副本中的第一个,python,pandas,Python,Pandas,在一系列复制品中,删除第一个复制品的最简单的方法是什么 我有一个数据帧: 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\u duplicates保留第一个或最后一个项目,具体取决于您的设置方
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\u duplicates
保留第一个或最后一个项目,具体取决于您的设置方式。我想删除第一个出现重复的情况,并保留其余情况。使用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
要保持每组一行的边缘情况(不再有效):
或:
这并不漂亮,但应该有用
F = []
for names, frames in df.groupby('Group'):
F.append(frames.sort_values('value').iloc[1:,:])
new_df = pd.concat(F)
数据输入
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
找到第一行的索引并将其与一起删除。感谢温家宝在回答中的通知,我们应该保留没有重复的行,我从他/她的方法中学习到选择有重复的组
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")
如果没有重复项,您希望发生什么?如果没有重复项,请保留该行。您关心连续性吗?在bs之后是否会有第二组as,您希望保留除第一组以外的所有as,或者它们会被视为a的副本并全部保留?这里有些错误,如果它是唯一的,它也会将其删除。您可以尝试再添加一行c11@Wen是的。更新了edge案例。感谢您在答案顶部的通知。我还了解了如何选择组!
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
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")