Python 3.x 如何从数据集中删除重复行,其中也包括重复字典?
因此,我有以下数据集Python 3.x 如何从数据集中删除重复行,其中也包括重复字典?,python-3.x,dictionary,duplicates,Python 3.x,Dictionary,Duplicates,因此,我有以下数据集 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_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”包括每一行中的字典
我想根据“芯片编号”、“测试密钥”、“临时”、“测试数据单元”和“测试标签”列从数据集中删除重复行(首先出现)
我使用以下代码删除数据集中首次出现的重复项。然而,我得到了一个错误
#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\u Label”列时。它很好用。但是,这不是我的意图
有人能想出一个主意吗?我怎样才能改进上面的代码
删除重复行后,我的数据集应该是这样的?
一种可能的解决方案是将带有
dict
值的列转换为字符串。但dictionary是无序数据类型,因此我们需要首先对其进行排序:
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...
非常感谢您@Andrej Kesely。这真的很有帮助。而且,我学到了一些新东西。再次感谢D