pandas Python中groupby和聚合的更快替代方法

fzwojiic  于 2022-12-28  发布在  Python
关注(0)|答案(1)|浏览(155)

我有一个报告的集合,可以用多种不同的方式分类。我试图根据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数组来处理数值数据。我这里有一个字符串列表,有什么替代方法可以让我更快地处理数据?

rhfm7lfc

rhfm7lfc1#

(...)类别的数量很大
考虑itertools.combinations的以下特性
0 <= r <= n时,返回的项数为n! / r! / (n-r)!;当r > n时,返回的项数为零。
其中n是可迭代项的个数,r是itertools.combinations的第二个参数,所以在combinations(categories, 2)的特殊情况下,该个数为

n! / 2! / (n-2)!

等于

n! / (n-2)! / 2!

等于

n * (n-1) / 2!

等于

n * (n-1) / 2

因此,时间消耗的比例将是45(n=10)、4950(n=100)、499500(n=1000),以此类推。虽然这不是一个可以显示您需要实现多少加速的解决方案。
(...)数组来处理数值数据。我在这里有一个字符串列表来代替(...)
请注意,如果您知道string a priori 的所有允许值,那么您可以轻松地为每个值分配number(修饰),然后处理数据,再将number改回string(取消修饰)

相关问题