python-3.x - 如何从数据集中删除重复的行,其中也包括重复的字典?
问题描述
所以我有以下数据集。
data = [[1, 'abc', 25, 'V', {'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MODE': 'buck', 'TEST': 'ldo_xtal', 'CS': 'bb', 'MODULE_NAME': 'ildo_xtal'}], [1, 'abc',25, 'V', {'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MODE': 'buck', 'TEST': 'ldo_xtal', 'CS': 'bb', 'MODULE_NAME': 'ildo_xtal'}], [1, 'abc', 25, 'MV', {'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MODE': 'buck', 'TEST': 'ldo_xtal', 'CS': 'bb', 'MODULE_NAME': 'ildo_xtal'}], [1, 'abc', 25, 'V', {'DEBUG': '1', 'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MODE': 'buck', 'MODULE_NAME': 'iosc_xtal32m', 'TEST': 'xtal32m', 'CS': 'bb', 'XTAL32M_53X_OSC.VI': 1}]]
Dataframe = pd.DataFrame(data, columns = ['Chip_Number', 'Test_Key', 'Temp', 'Test_Data_Unit', 'Test_Label'] )
Dataframe
在我的数据集中,最后一列“Test_Label”在每一行中都包含字典。
我想根据列“Chip_Number”、“Test_Key”、“Temp”、“Test_Data_Unit”和“Test_Label”从我的数据集中删除重复的行(首先出现)。
我使用以下代码删除数据集中第一个出现的重复项。但是,我遇到了一个错误。
#Drop the duplicates from the column of Dataframe["Chip_Number","Test_Key","Temp","Test_Data_Unit"] and only keep the last one
Dataframe.duplicated(subset = ["Chip_Number","Test_Key","Temp","Test_Data_Unit","Test_Label"]).sum()
Dataframe.loc[Dataframe.duplicated(subset = ["Chip_Number","Test_Key","Temp","Test_Data_Unit","Test_Label"], keep='last'),:]
Dataframe = Dataframe.drop_duplicates(subset = ["Chip_Number","Test_Key","Temp","Test_Data_Unit","Test_Label"],keep='last')
pd.set_option('display.max_colwidth', 10000)
Dataframe
错误,我在运行上面的代码后得到。
TypeError: unhashable type: 'dict'
但是,当我使用上面相同的代码而不使用“Test_Label”列时。它工作正常。但是,那不是我的本意。
有人可以有一个想法,我该如何改进上面的代码?
解决方案
一种可能的解决方案是将具有值的列转换dict
为字符串。但是字典是无序的数据类型,所以我们需要先对其进行排序:
import pandas as pd
data = [[1, 'abc', 25, 'V', {'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MODE': 'buck', 'TEST': 'ldo_xtal', 'CS': 'bb', 'MODULE_NAME': 'ildo_xtal'}], [1, 'abc',25, 'V', {'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MODE': 'buck', 'TEST': 'ldo_xtal', 'CS': 'bb', 'MODULE_NAME': 'ildo_xtal'}], [1, 'abc', 25, 'MV', {'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MODE': 'buck', 'TEST': 'ldo_xtal', 'CS': 'bb', 'MODULE_NAME': 'ildo_xtal'}], [1, 'abc', 25, 'V', {'DEBUG': '1', 'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MODE': 'buck', 'MODULE_NAME': 'iosc_xtal32m', 'TEST': 'xtal32m', 'CS': 'bb', 'XTAL32M_53X_OSC.VI': 1}]]
df = pd.DataFrame(data, columns = ['Chip_Number', 'Test_Key', 'Temp', 'Test_Data_Unit', 'Test_Label'] )
# create temporary column with string from the dict column `Test_Label`
df['tmp'] = df['Test_Label'].apply(lambda x: ' '.join(map(str, sorted(x.items()) )))
df = df.drop_duplicates(subset = ["Chip_Number","Test_Key","Temp","Test_Data_Unit","tmp"], keep='last')
del df['tmp'] # delete temporary column
print(df)
印刷:
Chip_Number Test_Key Temp Test_Data_Unit Test_Label
1 1 abc 25 V {'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MOD...
2 1 abc 25 MV {'REVISION': 'ac', 'VBAT': '3.000', 'POWER_MOD...
3 1 abc 25 V {'DEBUG': '1', 'REVISION': 'ac', 'VBAT': '3.00...
推荐阅读
- angular - testing angular template driven forms
- ansible - Ansible:加快查找和链接文件的速度
- node.js - Firefox 无法建立与 socket.io 的连接
- ruby-on-rails - Rails 凭据:编辑和未初始化的常量 Bundler (NameError)
- asp.net - ASP.NET OWIN Azure 广告登录在 iPhone (Safari) 浏览器上不起作用。在其他浏览器上很好
- angular - 无法绑定到“matMenuTriggerFor”,因为它不是“按钮”的已知属性
- javascript - 保证promise运行顺序,Word API JS
- php - How to avoid repeating similar sections of MySQL query code in PHP?
- javascript - How is this fat arrow operating in this code?
- spring-cloud - 带有 Eureka 的 Spring Cloud Gateway 得到 504(网关超时)