从列表中删除重复项-“ TypeError:'Series'对象是可变的,因此不能被散列。”

时间:2019-02-18 23:13:50

标签: python immutability mutable

我已经收到“ TypeError:'Series'对象是可变的,因此不能进行散列。”虽然我理解了它的含义,但似乎无法解决。由于元组是不可变的,因此我尝试将系列转换为元组(如下所示)。我收到相同的错误消息。知道如何解决此问题吗?

import pandas as pd

data_file = pd.read_csv("file:///C:/Users/carte/OneDrive/Desktop/TEST.csv")

Jordan = []
Carter = []
Reece = []
Liam = []
Bryce = []
David = []

Jordan = data_file['Jordan']
Carter = data_file['Carter']
Reece = data_file['Reece']
Liam = data_file['Liam']
Bryce = data_file['Bryce']
David = data_file['David']

invite = []
invite.append(Carter)
invite.append(Jordan)
invite.append(Reece)
invite.append(David)
invite.append(Liam)
invite.append(Bryce)

tuple(invite)

invite = list(dict.fromkeys(invite))
print(invite)

在某些情况下,我的代码应该采用每个列表中的所有名称,并删除重复项,然后在末尾打印单个列表。

2 个答案:

答案 0 :(得分:1)

正如Makoto所建议的那样,问题不是invite的类型,而是invite所要处理的类型。看来您正在尝试解压缩pandas.Series的每个实例以填充列表,然后再使用dict.fromkeys()进行重复数据删除。为此,您应该使用list.extend()而不是list.append()。前者扩展了一个列表,其中所有参数都包含在其参数内,而后者则将单个新元素添加到列表(Difference between append vs. extend list methods in Python)中。例如:

invite = []
invite.extend(Carter)
invite.extend(Jordan)

您可能还需要手动将pandas.Series转换为列表,如下所示:

invite = []
invite.extend(Carter.to_list())
invite.extend(Jordan.to_list())

请注意,在从CSV提取数据之前无需创建空列表。

答案 1 :(得分:0)

执行此操作的方法可能有多种,因此这是一个选项,可减少您所需的大量代码。

data_file = pd.read_csv("file:///C:/Users/carte/OneDrive/Desktop/TEST.csv")
#If your file only has these names for the column headers, then you
#can just iterate through the columns like this:

invites = []

for name in list(data_file.columns):
    invites.extend(data_file[name].tolist())

result = {}

for key in invites:
    result[key] = ""

uniques = list(result.keys())

我不喜欢用空白值创建字典,但这只是获得要拍摄的结果的一种方法。