首页 > 解决方案 > 如何删除数据框熊猫中包含相同元素的行?

问题描述

我有一个非常大的数据框[541909 rows x 8 columns]。这是它的外观:

       InvoiceNo StockCode                          Description  Quantity      InvoiceDate  UnitPrice  CustomerID         Country
0         536365    85123A   WHITE HANGING HEART T-LIGHT HOLDER         6   12/1/2010 8:26       2.55     17850.0  United Kingdom
1         536365     71053                  WHITE METAL LANTERN         6   12/1/2010 8:26       3.39     17850.0  United Kingdom
2         536365    84406B       CREAM CUPID HEARTS COAT HANGER         8   12/1/2010 8:26       2.75     17850.0  United Kingdom
3         536365    84029G  KNITTED UNION FLAG HOT WATER BOTTLE         6   12/1/2010 8:26       3.39     17850.0  United Kingdom
4         536365    84029E       RED WOOLLY HOTTIE WHITE HEART.         6   12/1/2010 8:26       3.39     17850.0  United Kingdom
...          ...       ...                                  ...       ...              ...        ...         ...             ...
541904    581587     22613          PACK OF 20 SPACEBOY NAPKINS        12  12/9/2011 12:50       0.85     12680.0          France
541905    581587     22899         CHILDREN'S APRON DOLLY GIRL          6  12/9/2011 12:50       2.10     12680.0          France
541906    581587     23254        CHILDRENS CUTLERY DOLLY GIRL          4  12/9/2011 12:50       4.15     12680.0          France
541907    581587     23255      CHILDRENS CUTLERY CIRCUS PARADE         4  12/9/2011 12:50       4.15     12680.0          France
541908    581587     22138        BAKING SET 9 PIECE RETROSPOT          3  12/9/2011 12:50       4.95     12680.0          France

我想删除每行重复的所有 InvoiceNo 并只保留一个。例如,前 5 行具有相同的 InvoiceNo,所以我只想保留其中的一行。

我尝试使用 for 循环来完成它,但是由于数据集非常大,它需要很长时间。有没有更快的方法来做到这一点?

标签: pythonpandasdataframe

解决方案


您可以按照@Netim 的建议使用drop_duplicates(参见文档)

import numpy as np
import pandas as pd

duplicates = np.random.randint(0, 10, 100)
values = np.arange(0, 100)

df = pd.DataFrame({
    'dupl': duplicates,
    'vals': values
})

那么你可以做

df.drop_duplicates(
    subset='dupl', keep='first',
    ignore_index=True
)

或者

df.drop_duplicates(
    subset='dupl', keep='last',
    ignore_index=True
)

但是,正如@Alex 所说,您必须决定要保留哪个副本。


推荐阅读