我有一个报告的集合,可以用多种不同的方式分类。我试图根据TF-IDF获取这些报告的不同分组组合的关键字。我使用groupby()函数来处理所有不同的组合,但是,当报告和类别的数量很大时,panda的groupby()会变得非常慢。下面是我使用的代码示例:
df = pd.DataFrame({'cat1': ['apple', 'apple', 'banana', 'banana', 'banana', 'apple'],
'cat2': ['a', 'a', 'b', 'b', 'c', 'c'],
'cat3': ['x', 'y', 'x', 'y', 'x', 'y'],
'cat4': ['i', 'ii', 'ii', 'iii', 'i', 'i'],
'cat5': ['red', 'blue', 'green', 'green', 'blue', 'red'],
'Reports': [['abc', 'def'], ['ghi', 'jkl', 'mno'], ['pqr'], ['stu','vwx'], ['yz','ab','cd'], ['ef','gh']]})
categories = ['cat1', 'cat2', 'cat3','cat4','cat5']
groups = [list(combo) for combo in combinations(categories, 2)]
for group in groups:
df1 = df.groupby([group[0], group[1]], as_index=False).agg({'Reports':'sum'})
# Some other functions to process df1 to get top keywords
我看过一些关于groupby在stackoverflow上的替代方法的建议,然而,它们主要使用numpy数组来处理数值数据。我这里有一个字符串列表,有什么替代方法可以让我更快地处理数据?
1条答案
按热度按时间rhfm7lfc1#
(...)类别的数量很大
考虑
itertools.combinations
的以下特性当
0 <= r <= n
时,返回的项数为n! / r! / (n-r)!
;当r > n
时,返回的项数为零。其中n是可迭代项的个数,r是
itertools.combinations
的第二个参数,所以在combinations(categories, 2)
的特殊情况下,该个数为等于
等于
等于
因此,时间消耗的比例将是45(n=10)、4950(n=100)、499500(n=1000),以此类推。虽然这不是一个可以显示您需要实现多少加速的解决方案。
(...)数组来处理数值数据。我在这里有一个字符串列表来代替(...)
请注意,如果您知道string a priori 的所有允许值,那么您可以轻松地为每个值分配number(修饰),然后处理数据,再将number改回string(取消修饰)