从Pandas中的列获取唯一值

时间:2017-12-18 23:39:46

标签: python pandas numpy

我有一个大型DataFrame(2000万行)。其中一列(称为类别)具有如下值:

  

食品::餐厅::网吧::商业

     

汽车经销商::商业::汽车

     

理发::业务

我想将此列中的所有唯一值放入列表/集合中。最有效的方法是什么?

2 个答案:

答案 0 :(得分:0)

df是您的数据框架,相关列是category

您可以先获取1d NumPy类别数组,然后在其上调用set()构造函数:

set(df.category.str.split('::', expand=True).values.flatten())

示例:

print(df)

                           category
0  food::restaurant::cafe::business
1  car dealer::business::automotive
2                  barber::business

res = set(df.category.str.split('::', expand=True).values.flatten())

{'barber',
 'automotive',
 'car dealer',
 'restaurant',
 None,
 'cafe',
 'food',
 'business'}

摆脱None

res = df.category.str.split('::', expand=True).values.flatten()
res = set(filter(lambda x: x is not None, res))

答案 1 :(得分:0)

使用stack()unique()

df.x.str.split("::", expand=True).stack().unique()

注意速度测试显示Brad Solomon的答案更快,请参阅此答案的底部。我将保留我的解决方案,因为它演示了仅使用Pandas方法链接的解决方案,但如果它是您想要的速度,则通过values转移到Numpy,然后set()似乎最好。

使用样本数据:

import numpy as np
import pandas as pd

# sample data
df = pd.DataFrame([["food::restaurant::cafe::business"],
                   ["car dealer::business::automotive"],
                   ["barber::business"]], columns=['x'])  

df.x.str.split("::", expand=True).stack().unique()

输出:

array(['food', 'restaurant', 'cafe', 'business', 'car dealer',
       'automotive', 'barber'], dtype=object)

对布拉德·所罗门的回答进行基准测试:

%%timeit
df.x.str.split("::", expand=True).stack().unique()
# 737 µs ± 13.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
res = df.x.str.split('::', expand=True).values.flatten()
set(filter(lambda x: x is not None, res))
# 461 µs ± 10.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)