2017-08-12 49 views
3

我想刪除基於我的第一列的重複項,讓我們假設這是'id'。我需要刪除的值是具有最少完整數據的記錄。使用熊貓和Python刪除重複項

比如我有4條下面enter image description here

屏幕截圖所示,我想根據我列id來刪除重複的。我希望刪除的重複項取決於其他列中的值。例如lname不能是一個數字。它不能是NA或空白。所以對於這個例子,我想保留中間行並刪除所有其他重複項。

如何實現一個智能過濾器,通過保持看起來最乾淨的記錄(基於其他字段中有更清晰的值)來刪除重複項。

我正在尋找python中的熊貓庫。任何方向將不勝感激。

data = pd.read_csv('x.csv'); 
data = (data.drop_duplicates(['id'], keep ='last')); 
+1

你更容易,如果您發佈實際的例子數據,而不是屏幕截圖來獲得幫助。另外,準確的標準是什麼,您的預期產出是什麼?你寫了你想保留中間行,但在你的屏幕截圖中有6行。更具體地說明你的約束條件,併發布[MCVE](https://stackoverflow.com/help/mcve)將加快響應時間。 –

回答

0

你可以使用grouped.apply,該文檔稱之爲「flexiable應用」,在其中將一個函數應用,需要一個組,但在功能組將被視爲實際DataFrame。因此,您可以過濾不需要的行並從該函數返回一個DataFrame。熊貓將智能地合併來自這些調用的所有數據幀結果。見文檔http://pandas.pydata.org/pandas-docs/stable/groupby.html

例如::

def select(g): 
    g = g.ix[g.IName.isnull(), :] 
    return g 

df = df.groupby('id').apply(select) 
0
# Filter your data to only keep strings/unicodes in the 'Iname' column. 
data = data.loc[[isinstance(row, (str, unicode)) for row in data['Iname']], :] 

# Replace empty strings with NaN values. 
data.replace("", np.nan, inplace=True) 

# Drop nulls, remove duplicates and keep last. 
data = data[data['Iname'].notnull()].drop_duplicates(subset='id', keep='last')