跳至主要内容

Pandas 删除重复值教程

学习如何使用 pandas 在 Python 中删除重复项。
· 4分钟 阅读

使用 AI 探索

删除重复项是一项获取准确计数的基本技能,因为您通常不希望将同一事物多次计入。在 Python 中,可以使用 Pandas 模块来完成,此模块提供了一个名为 drop_duplicates 的方法。

下面通过几个示例来理解如何使用它。

删除重复的姓名

假设您有一个包含就诊记录的数据框,兽医诊所想知道每个品种有多少只狗来过。然而,在您的数据集中有像 Max 和 Stella 这样的狗看过不止一次。因此,您不能仅通过统计品种列中每个品种的数量来得到结果。

print(vet_visits)
          date     name        breed  weight_kg
0   2018-09-02    Bella     Labrador      24.87
1   2019-06-07      Max     Labrador      28.35
2   2018-01-17   Stella    Chihuahua       1.51
3   2019-10-19     Lucy    Chow Chow      24.07
..         ...      ...          ...        ...
71  2018-01-20   Stella    Chihuahua       2.83
72  2019-06-07      Max    Chow Chow      24.01
73  2018-08-20     Lucy    Chow Chow      24.40
74  2019-04-22      Max     Labrador      28.54

为此,您需要移除那些包含之前已出现过的狗名的行,换句话说,您将从数据集中每个名字各保留一只狗。

您可以使用 drop_duplicates 方法来实现。它接收一个参数 subset,即我们基于其查找重复项的列——在这个例子中,我们想要所有唯一的名字。

vet_visits.drop_duplicates(subset="name")
          date     name        breed  weight_kg
0   2018-09-02    Bella     Labrador      24.87
1   2019-06-07      Max    Chow Chow      24.01
2   2019-03-19  Charlie       Poodle      24.95
3   2018-01-17   Stella    Chihuahua       1.51
4   2019-10-19     Lucy    Chow Chow      24.07
7   2019-03-30   Cooper    Schnauzer      16.91
10  2019-01-04   Bernie  St. Bernard      74.98
(6  2019-06-07      Max     Labrador      28.35)

但是,如果有同名的狗该怎么办?

删除重复的成对组合

在这种情况下,删除重复项时需要考虑的不仅仅是 name。由于两个 Max 属于不同的品种,我们可以删除数据集中之前已出现过的“名字与品种”配对组合的行。

unique_dogs = vet_visits.drop_duplicates(subset=["name", "breed"])
print(unique_dogs)
          date     name        breed  weight_kg
0   2018-09-02    Bella     Labrador      24.87
1   2019-03-13      Max    Chow Chow      24.13
2   2019-03-19  Charlie       Poodle      24.95
3   2018-01-17   Stella    Chihuahua       1.51
4   2019-10-19     Lucy    Chow Chow      24.07
6   2019-06-07      Max     Labrador      28.35
7   2019-03-30   Cooper    Schnauzer      16.91
10  2019-01-04   Bernie  St. Bernard      74.98

若要基于多列来删除重复项,我们可以向 subset 参数传入列名列表,在本例中为 name 和 breed。

现在两个 Max 都被保留了。

交互式示例

在本练习中,您将使用 sales 中的唯一值创建一些新的 DataFrame。sales 已可用,且已将 pandas 以 pd 导入。

您将执行以下步骤:

  • 首先,删除 sales 中 store 与 type 的重复配对行,保存为 store_types 并打印其前几行。
  • 然后,删除 sales 中 store 与 department 的重复配对行,保存为 store_depts 并打印其前几行。
  • 筛选节假周所在的行,并删除重复的 dates,保存为 holiday_dates。
  • 最后,选择 holiday_dates 的 date 列,并打印 holiday_dates 数据框。
# Drop duplicate store/type combinations
store_types = sales.drop_duplicates(subset=["store", "type"])
print(store_types.head())

# Drop duplicate store/department combinations
store_depts = sales.drop_duplicates(subset=["store", "department"])
print(store_depts.head())

# Subset the rows that are holiday weeks and drop duplicate dates
holiday_dates = sales[sales["is_holiday"]].drop_duplicates(subset="date")

# Print date col of holiday_dates
print(holiday_dates["date"])

运行上述代码,将产生如下结果:

      store type  department       date  weekly_sales  is_holiday  temperature_c  fuel_price_usd_per_l  unemployment
0         1    A           1 2010-02-05      24924.50       False          5.728                 0.679         8.106
901       2    A           1 2010-02-05      35034.06       False          4.550                 0.679         8.324
1798      4    A           1 2010-02-05      38724.42       False          6.533                 0.686         8.623
2699      6    A           1 2010-02-05      25619.00       False          4.683                 0.679         7.259
3593     10    B           1 2010-02-05      40212.84       False         12.411                 0.782         9.765
    store type  department       date  weekly_sales  is_holiday  temperature_c  fuel_price_usd_per_l  unemployment
0       1    A           1 2010-02-05      24924.50       False          5.728                 0.679         8.106
12      1    A           2 2010-02-05      50605.27       False          5.728                 0.679         8.106
24      1    A           3 2010-02-05      13740.12       False          5.728                 0.679         8.106
36      1    A           4 2010-02-05      39954.04       False          5.728                 0.679         8.106
48      1    A           5 2010-02-05      32229.38       False          5.728                 0.679         8.106
498    2010-09-10
691    2011-11-25
2315   2010-02-12
6735   2012-09-07
6810   2010-12-31
6815   2012-02-10
6820   2011-09-09
Name: date, dtype: datetime64[ns]

亲自试一试。

若要进一步了解计数与聚合数据,请观看我们课程 Data Manipulation with pandas 中的此视频。

本文内容摘自 DataCamp 的课程 Data Manipulation with pandas,作者为 Maggie Matsui 和 Richie Cotton。

主题