【问题标题】:How to remove duplicate rows from the dataset, which include the duplicate dictionary as well?如何从数据集中删除重复的行,其中也包括重复的字典?
【发布时间】:2020-04-16 20:17:33
【问题描述】:

所以我有以下数据集。

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" 列时。它工作正常。但是,那不是我的本意。

有人可以提出一个想法,我该如何改进上面的代码?

删除重复行后,我的数据集应该如下所示?

【问题讨论】:

    标签: python-3.x dictionary duplicates


    【解决方案1】:

    一种可能的解决方案是将具有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...
    

    【讨论】:

    • 非常感谢@Andrej Kesely。这真的很有帮助。另外,我学到了一些新东西。再次感谢。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2020-06-04
    • 2019-07-01
    • 2011-10-28
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多