熊猫groupby性能改善

时间:2020-07-09 12:52:07

标签: python pandas dataframe pandas-groupby

我执行以下操作:

output = (df_pointer
            .add(df1_pointer.dropna(how='all').sum(axis=1)
                 .groupby(level=0).sum()
                 .rename(str(trigger)).to_frame(), fill_value=0))

df_pointer是一个大容器,最初充满零,但密度越来越大。

df1_pointer是一个非常稀疏的多索引数据帧(具有两个级别),充满了nan和零。

我需要同时对各列求和,然后对1级索引(称为“层”)求和。

我知道很少有特殊之处。

对于0级索引的每个键(“实体”),我在“层”索引中正好有8个观察值:


Column             1    2    3    4    5    6    7    8    9    10    11    12    13    14    15
Entity    Layer
1        1        1    NaN    0.0    0.0    NaN    NaN    0.0    0.0    NaN    NaN    NaN    0.0    NaN    0.0    0.0    72.0
        2        NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    0.0
        3        NaN    0.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
        4        NaN    NaN    0.0    NaN    NaN    0.0    NaN    NaN    NaN    NaN    NaN    NaN    0.0    NaN    19.5
        5        NaN    NaN    NaN    NaN    1.32435    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
....

我尝试过:

output = (df_pointer
            .add(df1_pointer.dropna(how='all').sum(axis=1)
                 .groupby('Entity').sum()
                 .rename(str(trigger)).to_frame(), fill_value=0))

6.8 ms ± 829 µs per loop (mean ± standard deviation of 20 runs, 100 loops each)

output2 = (df_pointer
            .add(df1_pointer.dropna(how='all').sum(axis=1)
                 .groupby(level=0).sum()
                 .rename(str(trigger)).to_frame(), fill_value=0))

7.71 ms ± 518 µs per loop (mean ± standard deviation of 20 runs, 100 loops each)

output2 = (df_pointer
            .add(df1_pointer[df1_pointer!=0].dropna(how='all').sum(axis=1)
                 .groupby('Entity').sum()
                 .rename(str(trigger)).to_frame(), fill_value=0))

7.96 ms ± 429 µs per loop (mean ± standard deviation of 20 runs, 100 loops each)

output3 = (df_pointer
            .add(df1_pointer[df1_pointer!=0].dropna(how='all').sum(axis=1)
                 .unstack('Layer').sum(axis=1)
                 .rename(str(trigger)).to_frame(), fill_value=0))

9.26 ms ± 2.54 ms per loop (mean ± std. dev. of 20 runs, 10 loops each)

trigger只是特定迭代的列名。 有时是数字列表,有时只是数字。在此示例中,它来自以下列名称列表:trigger_list=list(range(1,16))

0 个答案:

没有答案