熊猫从列表列中获取唯一值

新手上路,请多包涵

如何获取 pandas 或 numpy 中列表列的唯一值,以便第二列来自

在此处输入图像描述

将导致 'action', 'crime', 'drama'

我能想到的最接近(但非功能性)的解决方案是:

  genres = data['Genre'].unique()

但这可以预见地导致 TypeError 说明列表是如何不可哈希的。

TypeError: unhashable type: 'list'

Set 似乎是个好主意,但是

genres = data.apply(set(), columns=['Genre'], axis=1)

但也会导致 TypeError: set() takes no keyword arguments

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

阅读 473
2 个回答

如果您只想找到唯一值,我建议使用 itertools.chain.from_iterable 连接所有这些列表

import itertools

>>> np.unique([*itertools.chain.from_iterable(df.Genre)])
array(['action', 'crime', 'drama'], dtype='<U6')

甚至更快

>>> set(itertools.chain.from_iterable(df.Genre))
{'action', 'crime', 'drama'}


Timings

 df = pd.DataFrame({'Genre':[['crime','drama'],['action','crime','drama']]})
df = pd.concat([df]*10000)

%timeit set(itertools.chain.from_iterable(df.Genre))
100 loops, best of 3: 2.55 ms per loo

%timeit set([x for y in df['Genre'] for x in y])
100 loops, best of 3: 4.09 ms per loop

%timeit np.unique([*itertools.chain.from_iterable(df.Genre)])
100 loops, best of 3: 12.8 ms per loop

%timeit np.unique(df['Genre'].sum())
1 loop, best of 3: 1.65 s per loop

%timeit set(df['Genre'].sum())
1 loop, best of 3: 1.66 s per loop

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

您可以使用 explode

 data = pd.DataFrame([
    {
        "title": "The Godfather: Part II",
        "genres": ["crime", "drama"],
        "director": "Fracis Ford Coppola"
    },
    {
        "title": "The Dark Knight",
        "genres": ["action", "crime", "drama"],
        "director": "Christopher Nolan"
    }
])
# Changed from data.explode("genres")["genres"].unique() as suggested by rafaelc
data["genres"].explode().unique()

结果是:

 array(['crime', 'drama', 'action'], dtype=object)

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

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