从数据框行中的列表(包含标记)获取唯一值

时间:2016-11-17 01:49:15

标签: python pandas dataframe

我的数据框中有一个列表,这是一个例子:

   movieId                     title                        genres
0        1                 Toy Story  [Animation, Comedy, Fantasy]
1        2                   Jumanji          [Adventure, Fantasy]
2        3          Grumpier Old Men             [Comedy, Romance]
3        4         Waiting to Exhale      [Comedy, Drama, Romance]

如何从此行的列表中获取包含唯一项目的列表? Pandas是否提供了一种快速内置的方法,可以在不使用循环的情况下完成此操作。

输出可以是:

[Animation, Comedy, Fantasy, Adventure, Romance, Drama]

3 个答案:

答案 0 :(得分:2)

您可以使用chain中的itertools展平嵌套列表,并使用set获取唯一值:

from itertools import chain
set(chain.from_iterable(df.genres))
# {'Adventure', 'Animation', 'Comedy', 'Drama', 'Fantasy', 'Romance'}

或其他pandas解决方案:

df.genres.apply(pd.Series).stack().drop_duplicates().tolist()
# ['Animation', 'Comedy', 'Fantasy', 'Adventure', 'Romance', 'Drama']

答案 1 :(得分:2)

使用集合并通过简单遍历系列更新它:

unique_items = set()

df.genres.apply(unique_items.update)

unique_items
Out[66]: {'Adventure', 'Animation', 'Comedy', 'Drama', 'Fantasy', 'Romance'}

答案 2 :(得分:1)

方法1
pd.DataFrameset

set(pd.DataFrame(df.genres.tolist()).stack().tolist())

方法2
自定义函数box + set

def box(l):
    lengths = [len(item) for item in l]
    shape = (len(l), max(lengths))
    a = np.full(shape, None, dtype=object)
    for i, r in enumerate(l):
        a[i, :lengths[i]] = r
    return a

set(box(df.genres.tolist()).ravel().tolist())

<强> 定时
enter image description here