是否可以对熊猫GroupBy对象执行group_by操作?

问题描述 投票:0回答:1

我需要对一个大熊猫数据帧执行非常昂贵的分组操作,并想知道是否有可能首先对数据帧的前n列进行分组,然后根据我的代码中的条件进行重新分组结果对象在另一列上,因此将新列添加到结果对象的索引中。

当前,DataFrame看起来像这样:

compound_data = {
    'n1': {0: 'n1_value_1', 1: 'n1_value_2', 2: 'n1_value_3'},
    'n2': {0: 'n2_value_1', 1: 'n2_value_2', 2: 'n2_value_3'},
    'n3': {0: 'n3_value_1', 1: 'n3_value_2', 2: 'n3_value_3'},
    'n4': {0: 'n4_value_1', 1: 'n4_value_2', 2: 'n4_value_3'},
}
compound_data_frame = pd.DataFrame(compound_data)

调用groupby的代码块如下所示:

categorical_columns = ['n3', 'n4']

for column in categorical_columns:
    counts = compound_data_frame.groupby(
                ['n1', 'n2', column]).size()

这意味着我最终要按n1和n2进行两次分组,我担心这在执行时间方面不必要地昂贵。我只想按n1和n2分组一次,然后以某种方式按n3分组第一次分组的结果,然后对n4重复此过程。

因此,如果我要首先对列“ n1”和“ n2”进行分组,则生成的对象可能看起来像这样(我们将此对象称为“ first_grouping”):

                      n3
index 
n1_value/n2_value    n3_value

我希望以后可以将其按n3分组并计算结果,以得出此结果:

                                count
index 
n1_value/n2_value/n3_value      1

之后,我要获取first_grouping对象,但是这次我要按n4而不是n3进行分组,因此最终结果如下所示:

                                count
index 
n1_value/n2_value/n4_value      1

我需要能够访问包含该对象已分组到的所有列的索引。将原始实现与新的,全面的groupby操作一起使用太慢了。

任何帮助将不胜感激。

python pandas group-by
1个回答
1
投票
IIUC,是的,您可以嵌套groupby,因为在下面的示例中,在apply中,变量x是一个数据帧,因此您可以对其执行与on相同的操作(如groupby)任何数据框:

df_ = pd.DataFrame({'n1':list('a'*8), 'n2':list('b'*4+'c'*4), 'n3':list('d'*2+'e'*2)*2, 0:range(8)}) print (df_.groupby(['n1','n2']).apply(lambda x: x.groupby('n3')[[0]].count())) 0 n1 n2 n3 a b d 2 e 2 c d 2 e 2

尽管在这种情况下,简单的df_.groupby(['n1','n2','n3'])[[0]].count()将执行相同的操作。 

编辑:一个更好的示例,该函数根据分组数据帧的大小不能执行相同的操作:

def f(x): gr = x.groupby('n3')[[0]] return gr.count() if len(x)>=4 else gr.tail(1) df_ = pd.DataFrame({'n1':list('a'*8), 'n2':list('b'*6+'c'*2), 'n3':list('d'*7+'e'), 0:range(8)}) print (df_.groupby(['n1','n2']).apply(f)) 0 n1 n2 n3 a b d 6 #returned the count c 6 6 #returned the last value of the group 7 7 #...

© www.soinside.com 2019 - 2024. All rights reserved.