用熊猫数据框中的多个列聚合具有多个自定义功能的多列的有效方法是什么?

Di Zou

我有一个分组的熊猫数据框。我想聚合多个列。对于每一列,都有多个聚合函数。这很简单。棘手的是,在每个聚合函数中,我想访问另一列中的数据。

我将如何有效地做到这一点?这是我已经拥有的代码:

import pandas

data = [
    {
        'id': 1,
        'A': 1,
        'B': 1,
        'C': 1,
        'D': 1,
        'E': 1,
        'F': 1,
    },
    {
        'id': 1,
        'A': 2,
        'B': 2,
        'C': 2,
        'D': 2,
        'E': 2,
        'F': 2,
    },
    {
        'id': 2,
        'A': 3,
        'B': 3,
        'C': 3,
        'D': 3,
        'E': 3,
        'F': 3,
    },
    {
        'id': 2,
        'A': 4,
        'B': 4,
        'C': 4,
        'D': 4,
        'E': 4,
        'F': 4,
    },
]

df = pandas.DataFrame.from_records(data)


def get_column(column, column_name):
    return df.iloc[column.index][column_name]


def agg_sum_a_b(column_a):
    return column_a.sum() + get_column(column_a, 'B').sum()


def agg_sum_a_b_divide_c(column_a):
    return (column_a.sum() + get_column(column_a, 'B').sum()) / get_column(column_a, 'C').sum()


def agg_sum_d_divide_sum_e_f(column_d):
    return column_d.sum() / (get_column(column_d, 'E').sum() + get_column(column_d, 'F').sum())


def multiply_then_sum(column_e):
    return (column_e * get_column(column_e, 'F')).sum()


df_grouped = df.groupby('id')
df_agg = df_grouped.agg({
    'A': [agg_sum_a_b, agg_sum_a_b_divide_c, 'sum'],
    'D': [agg_sum_d_divide_sum_e_f, 'sum'],
    'E': [multiply_then_sum]
})

此代码产生以下数据帧:

             A                                                 D                     E    
   agg_sum_a_b agg_sum_a_b_divide_c sum agg_sum_d_divide_sum_e_f sum multiply_then_sum
id                                                                  
1            6                    2   3                      0.5   3                 5
2           14                    2   7                      0.5   7                25

我这样做正确吗?有更好的方法吗?我发现我在聚合函数中另一列中访问数据的方式有点尴尬。

我使用的实际数据和代码大约有20列和大约40个聚合函数。也可能有数百个组,每个组有数百行。

当我使用实际数据和聚合函数执行此操作时,可能要花几分钟,这对我来说太慢了。有什么办法可以提高效率?

编辑:我正在使用Python 3.6和pandas 0.23.0 btw。谢谢!
编辑2:添加了一个示例,其中我不调用sum()列。

我想要一片T骨牛排

首先,我认为您需要的apply不仅仅是agg一次访问不同的列。这是一个如何稍微更改您想做的想法。让我们首先创建一个函数,将要执行的操作重新分组,然后将其作为结果列表返回:

def operations_to_perfom (df_g):

    df_g_sum = df_g.sum() #can do the same with mean, min, max ...

    # return all the operation you want 
    return  [ df_g_sum['A'] + df_g_sum['B'], 
              (df_g_sum['A'] + df_g_sum['B'])/df_g_sum['C'], 
              df_g_sum['A'], 
              float(df_g_sum['D'])/(df_g_sum['E']+df_g_sum['F']),
              (df_g['E']*df_g['F']).sum() ]

#use apply to create a serie with id as index and a list of agg
df_values = df.groupby('id').apply(operations_to_perfom)

# now create the result dataframe from df_values with tolist() and index
df_agg = pd.DataFrame( df_values.tolist(), index=df_values.index, 
         columns=pd.MultiIndex.from_arrays([['A']*3+['D']+['E'], 
                 ['agg_sum_a_b', 'agg_sum_a_b_div_c' ,'sum', 'agg_sum_d_div_sum_e_f', 'e_mult_f']]))

df_agg看起来像:

             A                                           D        E
   agg_sum_a_b agg_sum_a_b_div_c sum agg_sum_d_div_sum_e_f e_mult_f
id                                                                 
1            6                 2   3                   0.5        5
2           14                 2   7                   0.5       25

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫:聚合具有多个功能的多列

熊猫数据框重采样聚合函数使用具有自定义函数的多列?

pandas groupby聚合具有多个列的自定义功能

在数据框中计算具有多个类别列的行的有效方法?

创建两个熊猫数据框列的字典的最有效方法是什么?

熊猫对多个数据框列执行算术运算的最有效方法

从大型数据框中删除熊猫中的列(从开始到结束)的最有效方法是什么?

隔离特定列中具有相同值的数据框行的有效方法是什么?

使用Spark中的自定义功能聚合多个列

熊猫:自定义WMAPE函数聚合函数到多个列而没有for循环?

如何基于条件有效地连接多个熊猫数据框列?

根据自定义函数聚合数据框中的多个列

使用自定义包装规则实现这种 3 列响应式布局的最有效方法是什么?

在循环或lambda的多个数据框中添加具有相同字符串值的列的更有效方法?

使用具有不同数据的列中具有多个参数的数组创建自定义公式

如何创建具有某些值的自定义数据框作为熊猫中的列(Python3)?

具有多个输入和跨列的自定义功能的卷曲卷曲整洁评估编程

将数据存储到 Firebase 中的多个引用的最有效方法是什么?

从 SQL 中的多个表中选择数据的最有效方法是什么?

应用多个布尔蒙版以使用熊猫在列中设置值的有效方法

在字符串熊猫列中查找多个关键字的更有效方法

熊猫:在分组数据框中仅在选定列中联接值的有效方法

通过列中的标签列表将熊猫数据框行分组的有效方法

将熊猫数据框插入具有相同列的数据库的快速方法是什么?

将此数据输入到熊猫数据框的最有效方法是什么?

使用自定义比较功能按多列对熊猫数据框进行排序

在熊猫中使用自定义聚合函数在数据框中创建新列

从具有多个日期/价格列的数据框中以大熊猫创建面板

(有效)对熊猫中的多个数据框进行递归迭代