我有一个大型DataFrame(2000万行)。其中一列(称为类别)具有如下值:
食品::餐厅::网吧::商业
汽车经销商::商业::汽车
理发::业务
我想将此列中的所有唯一值放入列表/集合中。最有效的方法是什么?
答案 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)