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: unhashable type: ‘list’

我如何调用 drop_duplicates()?

更一般地说:

 df = pandas.DataFrame([[[1,0],"a"],[[0,0],"b"],[[1,0],"c"]], columns=["list", "letter"])

我想调用 df[“list”].drop_duplicates(),所以 drop_duplicates 适用于系列而不是数据框?

原文由 user 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 739
2 个回答

您可以使用 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]

如果你想保留订单结帐: numpy.unique with order preserved

原文由 Mazdak 发布,翻译遵循 CC BY-SA 4.0 许可协议

drop_duplicates

在元组数据上调用 drop_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()

或者,

 pd.Series(
    list(k) for k in OrderedDict.fromkeys(map(tuple, df[0].tolist()))
).to_frame()

         0
0  [1, 0]
1  [0, 0]

原文由 cs95 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题