使用 pandas 和 Python 删除重复项
Posted
技术标签:
【中文标题】使用 pandas 和 Python 删除重复项【英文标题】:Remove duplicates using pandas & Python 【发布时间】:2018-01-21 03:28:36 【问题描述】:我想根据我的第一列删除重复项,让我们假设这是“id”。我需要删除的值是数据最不完整的记录。
例如我有 4 条记录显示在下面的屏幕截图中
我想根据我的列 ID 删除重复项。但是,我想删除的重复项取决于我其他列中的值。例如 lname 不能是数字。它也不能是 NA 或空白。所以对于这个例子,我想保留中间行并删除所有其他重复项。
如何实现智能过滤器,通过保持看起来最干净的记录(基于其他字段中的更干净的值)来删除重复项。
我正在研究 python 中的熊猫库。任何方向将不胜感激。
data = pd.read_csv('x.csv');
data = (data.drop_duplicates(['id'], keep ='last'));
【问题讨论】:
如果您发布实际示例数据而不是屏幕截图,您更有可能获得帮助。另外,确切的标准是什么,您的预期输出是什么?您写道要保留中间行,但屏幕截图中有 6 行。更具体地说明您的限制条件并发布MCVE 将加快响应时间。 【参考方案1】:# 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')
【讨论】:
【参考方案2】:您可以使用grouped.apply
,文档将其称为“灵活应用”,您可以在其中传递一个函数来应用,该函数采用一个组,但在该函数中,该组将被视为实际的DataFrame
。因此,您过滤不需要的行并从该函数返回单个 DataFrame
。 Pandas 将智能地组合来自这些调用的所有数据帧结果。请参阅文档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)
【讨论】:
以上是关于使用 pandas 和 Python 删除重复项的主要内容,如果未能解决你的问题,请参考以下文章
使用 Pandas 删除 Python 中的多余行 [重复]