熊猫删除重复的行(超过两行)



我有一个 df,里面有 9 行三种货币的数据。我只想删除具有相同货币、相同描述、相同价格和相同代码的所有行。

最终结果应删除第 6、7 和 8 行的 CAD,因为第 2 行中的 EUR 描述和第 5 行的美元价格与其他不同。但是,当我使用drop_duplicates时,它实际上会删除重复项,例如第 0、1 行;和 3、4;和所有CAD。

这是我的数据帧:

Description Currency   Price    Ticker
0     Trading      EUR  100.32  EQUITIES
1     Trading      EUR  100.32  EQUITIES
2        Debt      EUR  100.32  EQUITIES
3     Trading      USD   98.32      BOND
4     Trading      USD   98.32      BOND
5     Trading      USD   98.22      BOND
6        Debt      CAD   99.35      BOND
7        Debt      CAD   99.35      BOND
8        Debt      CAD   99.35      BOND

Create df:

description="Trading Trading Debt Trading Trading Trading Debt Debt Debt".split()
currency="EUR EUR EUR USD USD USD CAD CAD CAD".split()
price="100.32 100.32 100.32 98.32 98.32 98.22 99.35 99.35 99.35".split()
ticker="EQUITIES EQUITIES EQUITIES BOND BOND BOND BOND BOND BOND".split()
df = pd.DataFrame({"Description": description, "Currency": currency, "Price": price, "Ticker": ticker})
def hamming_distance(a, b):
return sum(x != y for x, y in zip(a, b))
grouped = df.groupby(by=['Description', 'Currency', 'Price', 'Ticker']).groups
for k, v in grouped.items():
if (len(v) > 1) and (1 not in [hamming_distance(k, j) for j in grouped.keys()]):
df = df.drop(index=v)
print(df)

输出:

0     Trading      EUR  100.32  EQUITIES
1     Trading      EUR  100.32  EQUITIES
2        Debt      EUR  100.32  EQUITIES
3     Trading      USD   98.32      BOND
4     Trading      USD   98.32      BOND
5     Trading      USD   98.22      BOND

解释:

在删除之前,我们有:

for k, v in grouped.items():
print(k, v)
('Debt', 'CAD', '99.35', 'BOND') Int64Index([6, 7, 8], dtype='int64')
('Debt', 'EUR', '100.32', 'EQUITIES') Int64Index([2], dtype='int64')
('Trading', 'EUR', '100.32', 'EQUITIES') Int64Index([0, 1], dtype='int64')
('Trading', 'USD', '98.22', 'BOND') Int64Index([5], dtype='int64')
('Trading', 'USD', '98.32', 'BOND') Int64Index([3, 4], dtype='int64')

如果不存在另一个仅在一个地方不同的键元组,我们将删除键元组的所有行(这是我的假设,否则它有点混战)。

所以,('Trading', 'USD', '98.22', 'BOND')('Trading', 'USD', '98.32', 'BOND')互相"拯救"。

('Debt', 'EUR', '100.32', 'EQUITIES')('Trading', 'EUR', '100.32', 'EQUITIES')互相"拯救"。

从我在评论中读到的内容来看,您的意思是删除所有列中具有相同值的所有行。如果是这样,则可以使用pd.drop_duplicates(keep=False).默认情况下,子集设置为所有列 (subset=None) 并保留第一个重复的行 (keep='first')

import pandas as pd
data = {
'Description': ['Trading', 'Trading', 'Debt', 'Trading', 'Trading', 'Trading', 'Debt', 'Debt', 'Debt'],
'Currency': ['EUR', 'EUR', 'EUR', 'USD', 'USD', 'USD', 'CAD', 'CAD', 'CAD'],
'Price': [100.32, 100.32, 100.32, 98.32, 98.32, 98.22, 99.35, 99.35, 99.35],
'Ticker': ['EQUITIES', 'EQUITIES', 'EQUITIES', 'BOND', 'BOND', 'BOND', 'BOND', 'BOND', 'BOND']
}
df = pd.DataFrame.from_dict(data)

输出:

Description   Currency    Price    Ticker
0   Trading       EUR         100.32   EQUITIES
1   Trading       EUR         100.32   EQUITIES
2   Debt          EUR         100.32   EQUITIES
3   Trading       USD         98.32    BOND
4   Trading       USD         98.32    BOND
5   Trading       USD         98.22    BOND
6   Debt          CAD         99.35    BOND
7   Debt          CAD         99.35    BOND
8   Debt          CAD         99.35    BOND

我们有:

  • 第 0 行和第 1 行具有相同的信息 ->删除两者
  • 第 2 行的Description与第 0 行和第 1 行不同 -> Keep
  • 第 3 行和第 4 行具有相同的信息 ->删除两者
  • 第 5 行与第 3 行和第 4 行Price不同 -> Keep
  • 第 6、7 和 8 行具有相同的信息 ->全部删除 这将留下第 2 行和第 5 行
df = df.drop_duplicates(keep=False)

导致:

Description   Currency   Price    Ticker
2   Debt          EUR        100.32   EQUITIES
5   Trading       USD        98.22    BOND

最新更新