基于2个元素的列表重复删除列表

时间:2017-12-12 21:32:31

标签: python pandas csv

我有一个列表如下:

[[Joel,Green,597], [Katie,Higgins,623], [Joel,Green,123], ...]

我想通过查看姓名和姓氏来删除列表中的元素(应删除具有相同名称和姓氏的元素)。在上面的示例中,结果列表应仅包含:

[[Katie,Higgins,623]]

我已尝试过以下代码,但只有当某些列表的所有三个元素都相同时才执行重复删除:

newlist = []
reader = csv.reader(f,delimiter=",")  # read content
my_list = list(reader) #put content in my_list
for i in my_list:
    if i not in newlist:
        newlist.append(i)

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:9)

使用DataFrame.drop_duplicates

pd.read_csv(filename, header=None, names=['first','last','val']) \
  .drop_duplicates(['first','last'], keep=False) \
  .values.tolist()

来自docs:

keep : {‘first’, ‘last’, False}, default ‘first’

first : Drop duplicates except for the first occurrence.
last : Drop duplicates except for the last occurrence.
False : Drop all duplicates.

答案 1 :(得分:5)

由于您使用pandas

标记drop_duplicates这里是大熊猫的方式
pd.Series(l).apply(pd.Series).drop_duplicates([0,1],keep=False).values.tolist()
Out[1267]: [['Katie', 'Higgins', 623]]

更多信息:

l=[['Joel','Green',597], ['Katie','Higgins',623], ['Joel','Green',123]]

答案 2 :(得分:4)

最好在这里使用Counter来跟踪包含人名和姓氏的元组。然后我们可以执行两遍算法:

  1. 首先构建Counter;
  2. 接下来过滤清单。
  3. 我们可以这样做:

    from collections import Counter
    from operator import itemgetter
    
    reader = csv.reader(f,delimiter=",")
    my_list = list(reader)
    
    getter = itemgetter(0,1)
    
    counter = Counter(map(getter, my_list))
    
    new_list = [item for item in my_list if counter[getter(item)] <= 1]

    因此,如果getter(item)(包含前两项的元组)发生了两次或更多次,我们会过滤列表中的所有项目。