Python复制了df.duplicated和df.drop_duplicated,但未找到所有重复项
我在使用duplicated或drop_duplicates查找/删除数据帧中的所有副本时遇到问题 我的数据看起来像这样,但是,我的数据有52k行长Python复制了df.duplicated和df.drop_duplicated,但未找到所有重复项,python,pandas,Python,Pandas,我在使用duplicated或drop_duplicates查找/删除数据帧中的所有副本时遇到问题 我的数据看起来像这样,但是,我的数据有52k行长 data = {'inventory number':['WL-SMART-INWALL', 'WL-NMDISH-22', 'WL-MPS546-MESH', 'WAS-WG-500P',
data = {'inventory number':['WL-SMART-INWALL',
'WL-NMDISH-22',
'WL-MPS546-MESH',
'WAS-WG-500P',
'UKS/99757/69975',
'UKS/99757/69975',
'UKS/99750/S26361F2293L10',
'UKS/99750/S26361F2293L10',
'UKS/99733/69973',
'UKS/99733/69973',
'UKS/99727/AHD6502TU3CBK',
'UKS/99727/AHD6502TU3CBK',
'UKS/99725/PMK01',
'UKS/99725/PMK01',
'UKS/99294/A3L791R15MS',
'UKS/99294/A3L791R15MS',
'UKS/98865/58018251',
'UKS/98865/58018251',
'UKS/98509/90Q653AN1N0N2UA0',
'UKS/98509/90Q653AN1N0N2UA0',
'UKS/97771/FIBLCSC2',
'UKS/97771/FIBLCSC2',
'UKS/97627/FIBLCLC1',
'UKS/97627/FIBLCLC1'],
'minimum price': ['36.85',
'55.45',
'361.29',
'265.0',
'22.46',
'22.46',
'15.0',
'15.0',
'26.71',
'26.71',
'104.0',
'104.0',
'32.3',
'32.3',
'22.51',
'22.51',
'13.0',
'13.0',
'9.59',
'9.59',
'15.0',
'15.0',
'15.0',
'15.0'],
'cost':['26.11',
'39.23',
'254.99',
'187.09',
'16.0',
'16.0',
'10.7',
'10.7',
'19.0',
'19.0',
'73.46',
'73.46',
'23.0',
'23.0',
'16.0',
'16.0',
'9.29',
'9.29',
'7.0',
'7.0',
'10.7',
'10.7',
'10.7',
'10.7']
}
df = pd.DataFrame(data=data)
我通过将上周的目录添加到本周底部来生成数据框。我只想对已经更改的“库存编号”进行处理,或者我想要增量。我想我可以附加这两个,确保它们是相同的数据类型,重新索引,并删除重复项,但当我将CSV写入QA时,仍然有数千个重复项
combined.head(50).duplicated()
这是我的密码:
_import['inventory number'] = _import['inventory number'].str.encode('utf-8')
ts_data['inventory number'] = ts_data['inventory number'].str.encode('utf-8')
overlap = overlap.append(ts_data, ignore_index=True)
overlap_dedupe = overlap[overlap.duplicated(['inventory number','minimum price','cost'],keep=False)==False]
我也尝试过:
overlap_dedupe = overlap.drop_duplicates(keep=False)
所以,我知道我遇到了某种编码问题,因为现在我没有得到重复
combined.head(50).duplicated()
返回:
42736 False
32567 False
43033 False
33212 False
46592 False
46023 False
32568 False
33520 False
32756 False
26741 False
46133 False
42737 False
42480 False
40227 False
40562 False
49623 False
27712 False
31848 False
49794 False
27296 False
38198 False
35674 False
27907 False
22210 False
40563 False
18025 False
49624 False
18138 False
19357 False
43698 False
24398 False
50566 False
22276 False
38382 False
20507 False
43550 False
18150 False
29968 False
19247 False
47706 False
19248 False
43955 False
20731 False
38199 False
44168 False
17580 False
15944 False
44891 False
28327 False
16027 False
dtype: bool
这些是姐妹函数,它们可以很好地协同工作 使用您的
df
df = pd.read_json(
''.join(
['[[26.11,"WL-SMART-INWALL",36.85],[39.23,"WL-NMDISH-22",55.45',
'],[73.46,"UKS\\/99727\\/AHD6502TU3CBK",104.0],[73.46,"UKS\\/997',
'27\\/AHD6502TU3CBK",104.0],[23.0,"UKS\\/99725\\/PMK01",32.3],[2',
'3.0,"UKS\\/99725\\/PMK01",32.3],[16.0,"UKS\\/99294\\/A3L791R15MS',
'",22.51],[16.0,"UKS\\/99294\\/A3L791R15MS",22.51],[9.29,"UKS\\/',
'98865\\/58018251",13.0],[9.29,"UKS\\/98865\\/58018251",13.0],[7',
'.0,"UKS\\/98509\\/90Q653AN1N0N2UA0",9.59],[7.0,"UKS\\/98509\\/90',
'Q653AN1N0N2UA0",9.59],[254.99,"WL-MPS546-MESH",361.29],[10.7',
',"UKS\\/97771\\/FIBLCSC2",15.0],[10.7,"UKS\\/97771\\/FIBLCSC2",1',
'5.0],[10.7,"UKS\\/97627\\/FIBLCLC1",15.0],[10.7,"UKS\\/97627\\/F',
'IBLCLC1",15.0],[187.09,"WAS-WG-500P",265.0],[16.0,"UKS\\/9975',
'7\\/69975",22.46],[16.0,"UKS\\/99757\\/69975",22.46],[10.7,"UKS',
'\\/99750\\/S26361F2293L10",15.0],[10.7,"UKS\\/99750\\/S26361F229',
'3L10",15.0],[19.0,"UKS\\/99733\\/69973",26.71],[19.0,"UKS\\/997',
'33\\/69973",26.71]]']
)
)
我们可以清楚地看到,有重复的
df.duplicated()
0 False
1 False
2 False
3 True
4 False
5 True
6 False
7 True
8 False
9 True
10 False
11 True
12 False
13 False
14 True
15 False
16 True
17 False
18 False
19 True
20 False
21 True
22 False
23 True
dtype: bool
df.duplicated().any()
True
因为我们没有传递keep
参数,所以我们假设默认值是keep='first'
。这意味着此系列中的每个True
都表示一行是其上方另一行的副本,其duplicated
状态为False
我们可以走捷径,只需得到一个答案,即是否存在与
df.duplicated()
0 False
1 False
2 False
3 True
4 False
5 True
6 False
7 True
8 False
9 True
10 False
11 True
12 False
13 False
14 True
15 False
16 True
17 False
18 False
19 True
20 False
21 True
22 False
23 True
dtype: bool
df.duplicated().any()
True
调用drop\u duplicates
df.drop_duplicates().duplicated().any()
False
太好了!它起作用了。这可以用酒精保存
df = df.drop_duplicates()
df
0 1 2
0 26.11 WL-SMART-INWALL 36.85
1 39.23 WL-NMDISH-22 55.45
2 73.46 UKS/99727/AHD6502TU3CBK 104.00
4 23.00 UKS/99725/PMK01 32.30
6 16.00 UKS/99294/A3L791R15MS 22.51
8 9.29 UKS/98865/58018251 13.00
10 7.00 UKS/98509/90Q653AN1N0N2UA0 9.59
12 254.99 WL-MPS546-MESH 361.29
13 10.70 UKS/97771/FIBLCSC2 15.00
15 10.70 UKS/97627/FIBLCLC1 15.00
17 187.09 WAS-WG-500P 265.00
18 16.00 UKS/99757/69975 22.46
20 10.70 UKS/99750/S26361F2293L10 15.00
22 19.00 UKS/99733/69973 26.71
只是为了确保
df.duplicated().any()
False
结论
这对我很管用。希望本演示能帮助您解决任何问题。您能给出一个小数据框的示例,它愚弄了
duplicated()
?@DYZ我编辑了我提供的示例,使其成为我的代码使用drop\u duplicates生成的前25行。然而,我在这个样本上运行了drop-replices,它工作得非常好。$@Yale-Newman那么恐怕没有什么帮助。在一个问题被解决之前,我们应该能够重现它。我读过,也许是内存问题?但是50k行乘3列不应该太多?有没有比删除重复项更有效的方法?我应该成批这样做吗50K什么都不是。这不是内存问题。为什么你不能展示一个没有被移除的复制品的例子呢?当我从我自己的例子开始时,一切都很好。这让我觉得这和我的数据有关。我正在从查询中读取数据,并从ftp导入数据,以获得两个起始数据帧。然后我将它们附加在一起,并试图去除所有重复项,以便留下增量。它就是不起作用。你对我如何调试这个有什么建议吗?如果您运行测试df.duplicated().any()
并返回True
,您可以演示我如何使用groupby。那么你有重复的。但是,您说它不起作用意味着df.drop\u duplicates().duplicated().any()
返回True
。这是我不相信的。除非!你是说它看起来像是重复的。你是不是只是眼巴巴地看着这些数据,然后告诉我看起来仍然有重复的数据?如果是这样的话,这让我相信你认为存在重复,而事实上不是因为某些非印刷字符使它们不同。不,我完全同意,一定是某种编码差异或某些非印刷字符导致它们不同。在excel中,您可以执行修剪之类的操作。有没有一种方法可以让我清理我的数据,看看是否有效?或者我应该采取什么步骤来查找未打印的字符?我肯定遇到了某种编码问题,因为在运行附加和删除重复项之前,我只是将代码转换为unicode编码字符串,现在我没有得到任何重复项,而以前我会得到几千个。