Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫会在由列表组成的元素上放置重复项_Python_Python 3.x_Pandas - Fatal编程技术网

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因为这个问题的答案很长,但在这里: