2017-08-12 48 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')