Python Pandas在重复系列中首次下降

时间:2018-01-05 18:50:22

标签: python pandas

在一系列副本中放弃唯一第一个的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 保留第一个或最后一个项目,具体取决于您的设置方式。我希望删除第一个出现重复的事件并保留其余部分。

4 个答案:

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