[英]Python Pandas Dropping First in Series of Duplicates
在一系列重復中刪除唯一第一個的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
保留第一個或最后一個項目,具體取決於您如何設置它。 我希望在有重復的情況下放棄第一次出現並保留其余部分。
使用duplicated()
創建一個布爾掩碼並基於它進行過濾:
df[df.Group.duplicated()]
#Group Value
#1 a 1
#2 a 2
#4 b 7
#5 b 8
duplicated
默認口罩重復,除了第一次出現是真的:
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
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
這不是很好,但它應該工作
F = []
for names, frames in df.groupby('Group'):
F.append(frames.sort_values('value').iloc[1:,:])
new_df = pd.concat(F)
找到第一行的索引,並刪除它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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.