Pandas drop_duplicates 方法不适用于包含列表的数据框
Pandas drop_duplicates method not working on dataframe containing lists
我正在尝试在我的数据框上使用 drop_duplicates 方法,但我得到了一个
错误。请参阅以下内容:
error: TypeError: unhashable type: 'list'
我使用的代码:
df = db.drop_duplicates()
我的数据库很大,包含字符串、浮点数、日期、NaN、布尔值、整数...感谢任何帮助。
drop_duplicates 不会像错误消息所暗示的那样与数据框中的列表一起使用。但是,您可以在转换为 str 的数据帧上删除重复项,然后使用结果中的索引从原始 df 中提取行。
设置
df = pd.DataFrame({'Keyword': {0: 'apply', 1: 'apply', 2: 'apply', 3: 'terms', 4: 'terms'},
'X': {0: [1, 2], 1: [1, 2], 2: 'xy', 3: 'xx', 4: 'yy'},
'Y': {0: 'yy', 1: 'yy', 2: 'yx', 3: 'ix', 4: 'xi'}})
#Drop directly causes the same error
df.drop_duplicates()
Traceback (most recent call last):
...
TypeError: unhashable type: 'list'
解决方案
#convert hte df to str type, drop duplicates and then select the rows from original df.
df.loc[df.astype(str).drop_duplicates().index]
Out[205]:
Keyword X Y
0 apply [1, 2] yy
2 apply xy yx
3 terms xx ix
4 terms yy xi
#the list elements are still list in the final results.
df.loc[df.astype(str).drop_duplicates().index].loc[0,'X']
Out[207]: [1, 2]
Edit: replaced iloc with loc. In this particular case, both work as the
index matches the positional index, but it is not general
@Allen 的回答很好,但是有点小问题
df.iloc[df.astype(str).drop_duplicates().index]
示例中应该是 loc 而不是 iloc.loot。
a = pd.DataFrame([['a',18],['b',11],['a',18]],index=[4,6,8])
Out[52]:
0 1
4 a 18
6 b 11
8 a 18
a.iloc[a.astype(str).drop_duplicates().index]
Out[53]:
...
IndexError: positional indexers are out-of-bounds
a.loc[a.astype(str).drop_duplicates().index]
Out[54]:
0 1
4 a 18
6 b 11
概览:您可以看到哪些行是重复的
方法一:
df2=df.copy()
mylist=df2.iloc[0,1]
df2.iloc[0,1]=' '.join(map(str,mylist))
mylist=df2.iloc[1,1]
df2.iloc[1,1]=' '.join(map(str,mylist))
duplicates=df2.duplicated(keep=False)
print(df2[duplicates])
方法二:
print(df.astype(str).duplicated(keep=False))
我还想提一下(以防其他人和我一样愚蠢),如果你错误地给出一个列表列表作为 'subset' 参数,你会得到同样的错误 drop_duplicates函数。
原来我花了几个小时寻找一个不在我的数据框中的列表,这都是因为我在参数中放置了一个对多个括号。
我正在尝试在我的数据框上使用 drop_duplicates 方法,但我得到了一个 错误。请参阅以下内容:
error: TypeError: unhashable type: 'list'
我使用的代码:
df = db.drop_duplicates()
我的数据库很大,包含字符串、浮点数、日期、NaN、布尔值、整数...感谢任何帮助。
drop_duplicates 不会像错误消息所暗示的那样与数据框中的列表一起使用。但是,您可以在转换为 str 的数据帧上删除重复项,然后使用结果中的索引从原始 df 中提取行。
设置
df = pd.DataFrame({'Keyword': {0: 'apply', 1: 'apply', 2: 'apply', 3: 'terms', 4: 'terms'},
'X': {0: [1, 2], 1: [1, 2], 2: 'xy', 3: 'xx', 4: 'yy'},
'Y': {0: 'yy', 1: 'yy', 2: 'yx', 3: 'ix', 4: 'xi'}})
#Drop directly causes the same error
df.drop_duplicates()
Traceback (most recent call last):
...
TypeError: unhashable type: 'list'
解决方案
#convert hte df to str type, drop duplicates and then select the rows from original df.
df.loc[df.astype(str).drop_duplicates().index]
Out[205]:
Keyword X Y
0 apply [1, 2] yy
2 apply xy yx
3 terms xx ix
4 terms yy xi
#the list elements are still list in the final results.
df.loc[df.astype(str).drop_duplicates().index].loc[0,'X']
Out[207]: [1, 2]
Edit: replaced iloc with loc. In this particular case, both work as the index matches the positional index, but it is not general
@Allen 的回答很好,但是有点小问题
df.iloc[df.astype(str).drop_duplicates().index]
示例中应该是 loc 而不是 iloc.loot。
a = pd.DataFrame([['a',18],['b',11],['a',18]],index=[4,6,8])
Out[52]:
0 1
4 a 18
6 b 11
8 a 18
a.iloc[a.astype(str).drop_duplicates().index]
Out[53]:
...
IndexError: positional indexers are out-of-bounds
a.loc[a.astype(str).drop_duplicates().index]
Out[54]:
0 1
4 a 18
6 b 11
概览:您可以看到哪些行是重复的
方法一:
df2=df.copy()
mylist=df2.iloc[0,1]
df2.iloc[0,1]=' '.join(map(str,mylist))
mylist=df2.iloc[1,1]
df2.iloc[1,1]=' '.join(map(str,mylist))
duplicates=df2.duplicated(keep=False)
print(df2[duplicates])
方法二:
print(df.astype(str).duplicated(keep=False))
我还想提一下(以防其他人和我一样愚蠢),如果你错误地给出一个列表列表作为 'subset' 参数,你会得到同样的错误 drop_duplicates函数。
原来我花了几个小时寻找一个不在我的数据框中的列表,这都是因为我在参数中放置了一个对多个括号。