簡體   English   中英

在 pandas Dataframe 中刪除重復項

[英]Drop duplicates in pandas Dataframe

我有一個 DataFrame

  Type   Numer   master      width
  xyz    465_0     123        305
  xyz    465_0     123        305
  xyz    465_0     123        305
  xyz    465_0     123        315
  xyz    465_1     123        305
  xyz    465_1     123        305
  xyz    465_1     123        305
  xyz    465_1     123        315
  xyz    465_2     123        305
  xyz    465_2     123        305
  xyz    465_2     123        305
  xyz    465_2     123        315
  xyz    465_3     123        305
  xyz    465_3     123        305
  xyz    465_3     123        305
  xyz    465_3     123        315

由此我需要以下 DataFrame

  Type   Numer   master      width
  xyz    465_0     123        305
  xyz    465_1     123        305
  xyz    465_2     123        305
  xyz    465_3     123        315

我的嘗試是:

df[['Numer1', 'dig']] = df['Numer'].str.split("_", expand=True)
df = df.drop('Numer', axis = 1)
df.drop_duplicates()

但它沒有給我結果。 我想以通用的方式編寫它,因為我有多種類型。

數據:

{'Type': ['xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 
          'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz'], 
 'Numer': ['465_0', '465_0', '465_0', '465_0', '465_1', '465_1', '465_1', '465_1', 
           '465_2', '465_2', '465_2', '465_2', '465_3', '465_3', '465_3', '465_3'], 
 'master': [123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123], 
 'width': [305, 305, 305, 315, 305, 305, 305, 315, 305, 305, 305, 315, 305, 305, 305, 315]}

我們可以使用groupby + cumcount為每個“Numer”創建特定於組的排名; 然后過濾“Numer”中的后綴與組中排名匹配的行:

out = df[df['Numer'].str.split('_').str[1].astype(int) == df.groupby('Numer').cumcount()].drop(columns='rank')

Output:

   Type  Numer  master  width
0   xyz  465_0     123    305
5   xyz  465_1     123    305
10  xyz  465_2     123    305
15  xyz  465_3     123    315

我從你的問題中了解到,你正試圖將每個Numer組中的width模式“折疊”成一個DataFrame ,它只有唯一的組( Numer )值和相同的width模式

一種方法是在反轉組后使用itertools庫中的zip_longest function -

from itertools import zip_longest
rev_zip_longest = list(zip_longest(*[reversed(df[col].unique()) for col in df.columns]))
# [('xyz', '465_3', 123, 315),
# (None, '465_2', None, 305),
# (None, '465_1', None, None),
# (None, '465_0', None, None)]

df2 = pd.DataFrame(rev_zip_longest)
df2.columns = df.columns
df2 = df2.fillna(method='ffill')
#  Type  Numer  master  width
# 0  xyz  465_3   123.0  315.0
# 1  xyz  465_2   123.0  305.0
# 2  xyz  465_1   123.0  305.0
# 3  xyz  465_0   123.0  305.0


此代碼也適用:

res = pd.concat([g.take([i.split('_')[1]]) for i,g in df.groupby('Numer')])

print(res)
'''
   Type  Numer  master  width
0   xyz  465_0     123    305
5   xyz  465_1     123    305
10  xyz  465_2     123    305
15  xyz  465_3     123    315

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM