使用 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

有条件地删除重复的pandas python

使用 Pandas 删除 Python 中的多余行 [重复]

python pandas删除重复的列

使用 pandas 追加数据和重写 CSV 时删除索引 [重复]

Python/Pandas - 按列值删除重复行