Python 熊猫会在由列表组成的元素上放置重复项
假设我的数据帧是:Python 熊猫会在由列表组成的元素上放置重复项,python,python-3.x,pandas,Python,Python 3.x,Pandas,假设我的数据帧是: df = pandas.DataFrame([[[1,0]],[[0,0]],[[1,0]]]) 这将产生: 0 0 [1, 0] 1 [0, 0] 2 [1, 0] 如果我写入以下内容,我希望删除重复项,并仅获取元素[1,0]和[0,0]: df.drop_duplicates() 我得到以下错误:TypeError:unshable类型:“list” 如何调用drop_duplicates() 一般而言: df = pandas.DataFra
df = pandas.DataFrame([[[1,0]],[[0,0]],[[1,0]]])
这将产生:
0
0 [1, 0]
1 [0, 0]
2 [1, 0]
如果我写入以下内容,我希望删除重复项,并仅获取元素[1,0]和[0,0]:
df.drop_duplicates()
我得到以下错误:TypeError:unshable类型:“list”
如何调用drop_duplicates()
一般而言:
df = pandas.DataFrame([[[1,0],"a"],[[0,0],"b"],[[1,0],"c"]], columns=["list", "letter"])
我想调用df[“list”]。drop_duplicates(),因此drop_duplicates适用于系列而不是数据帧?这里有一种方法,将列表系列转换为单独的列,只保留非重复项:
df[~df[0].apply(pandas.Series).duplicated()]
0
0 [1, 0]
1 [0, 0]
>>> df[0].apply(pd.Series).duplicated()
0 False
1 False
2 True
说明:
df[0]。应用(pandas.Series)
返回:
0 1
0 1 0
1 0 0
2 1 0
您可以从中找到重复项:
df[~df[0].apply(pandas.Series).duplicated()]
0
0 [1, 0]
1 [0, 0]
>>> df[0].apply(pd.Series).duplicated()
0 False
1 False
2 True
最后使用该删除重复项
调用drop\u duplicates
,对元组化数据执行以下操作:
df[0].apply(tuple, 1).drop_duplicates().apply(list).to_frame()
0
0 [1, 0]
1 [0, 0]
collections.OrderedDict
然而,我更喜欢不涉及apply
from collections import OrderedDict
pd.Series(map(
list, (OrderedDict.fromkeys(map(tuple, df[0].tolist()))))
).to_frame()
或者
您可以使用
numpy.unique()
函数:
>>> df = pandas.DataFrame([[[1,0]],[[0,0]],[[1,0]]])
>>> pandas.DataFrame(np.unique(df), columns=df.columns)
0
0 [0, 0]
1 [1, 0]
如果要保留订单签出:我尝试了其他答案,但没有解决我需要的问题(包含多个列表列的大型数据框) 我是这样解决的:
df = df[~df.astype(str).duplicated()]
我喜欢这个答案,它很漂亮simple@user及)@如果你认为一个答案比其他答案好,最好是“接受”这样其他人就可以知道什么样的解决方案最有效。@Omid所有答案都很好,而且都经过了投票,但这是我使用的一个,因为它很简单。似乎应该将这个或元组答案添加到pandas代码库中。为什么您更喜欢不涉及应用的东西?使用apply时,代码看起来可读性更强。@words因为这个问题的答案很长,但在这里: