Pandas:根据列表中的重复值删除行

时间:2016-08-03 20:59:07

标签: python pandas

我想根据字符串中是否有一个字符串重复来删除数据框中的行。例如,如果字符串是jkl-ghi-jkl,我会删除此行,因为jkl重复两次。我认为创建一个列表并检查列表中的重复项是理想的方法。

此示例的数据框由1列和2个数据点组成:

    0     [abc, def, ghi, jkl]
    1     [jkl, ghi, jkl, mno]
    Name: Col1, dtype: object

我采取的第一步是对我的数据应用拆分,并拆分“ - ”

    List = List.tolist()

产生输出:

    [['abc', 'def', 'ghi', 'jkl'], ['jkl', 'ghi', 'jkl', 'mno']]

我采取的第二步是将输出转换为列表:

    len(List) > len(set(List))

哪个收益率:

    TypeError: unhashable type: 'list'

我希望完成的最后一步是将完整列表与不同的唯一值列表进行比较:

    len(List) > len(set(List)

产生错误:

     Col1
     abc-def-ghi-jkl

我知道我的.tolist()会创建一个包含2个系列的列表。有没有办法将这些系列转换为列表以测试重复?我希望使用这段代码:

{{1}}

删除以删除每个单元格中具有重复值的所有行。

这是接近的正确方法,还是有更简单的方法?

我的结束输出应该如下:

{{1}}

因为字符串jkl-ghi-jkl-mno因“jkl”重复两次而被删除

4 个答案:

答案 0 :(得分:4)

您可以将str.splitduplicated结合使用,以获得布尔索引器:

# Get a Boolean indexer for duplicates.
dupe_rows = df1['Col1'].str.split('-', expand=True)
dupe_rows = dupe_rows.apply(lambda row: row.duplicated().any(), axis=1)

# Remove the duplicates.
df1 = df1[~dupe_rows]

修改

另一种选择是以与其他答案类似的方式使用toolz.isdistinct

import toolz

df1[df1.Col1.str.split('-').apply(toolz.isdistinct)]

答案 1 :(得分:4)

以下是使用setlen

的其他选项
df1 = pd.DataFrame({'Col1' : ['abc-def-ghi-jkl', 'jkl-ghi-jkl-mno'],})

df1['length'] = df1['Col1'].str.split('-').apply(set).apply(len)

print( df1 )

              Col1  length
0  abc-def-ghi-jkl       4
1  jkl-ghi-jkl-mno       3

df1 = df1.loc[ df1['length'] < 4 ]

print(df1)

              Col1  length
1  jkl-ghi-jkl-mno       3

答案 2 :(得分:3)

'Col1' numpy并使用有效的def nerpt(lst): ti = np.triu_indices(len(lst), 1) a = np.array(lst) return (a[ti[0]] == a[ti[1]]).any() df1[~df1.Col1.str.split('-').apply(nerpt)] 算法应用重复检查器。

set

enter image description here

计时

使用pd.concat([df1 for _ in range(10000)])非常清楚是最有效的。这反映了@Luis的回答

使用rpt1 = lambda lst: not pd.Index(lst).is_unique rpt2 = lambda lst: len(lst) != len(set(lst)) rpt3 = nerpt

function GetMonthName(monthNumber) {
      var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
      return months[monthNumber - 1];
}

enter image description here

答案 3 :(得分:1)

我走了你做过的路线,但是把所有东西都保存在一个数据帧中;使用apply()并编制索引以获得我需要的内容:

[in]:
gf1 = df1
gf1['Col2'] = gf1['Col1'].str.split('-')  #keep lists in same DF
gf1['Col3'] = gf1['Col2'].apply(set).apply(len) == gf1['Col2'].apply(len)
df1 = gf1['Col1'].loc[gf1['Col3'] == True]
df1
[Out]: 
0 abc-def-ghi-jkl
Name: Col1, dtype: object