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")