我有一个 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