【问题标题】:Pandas groupby agg apply a function with multiple parametersPandas groupby agg 应用具有多个参数的函数
【发布时间】:2020-12-07 03:21:15
【问题描述】:

如何将函数应用于需要来自 groupby 数据帧多列的参数并返回两个缩放器值的 pandas groupby。

以下是可重复的示例。最后一行获取 f_value

import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
import plotly.express as px

n=100
df = pd.DataFrame({
    'c': np.random.choice(['CATS', 'DOGS'], n),
    'x': np.random.choice(list('ABCDE'), n),
    'y': np.random.normal(5, 1, n)
})

signal = np.where(df['c'].eq('CATS') & df['x'].eq('A'), 1.1, 0)
df['y'] = df['y'] + signal

def get_ols_fp(df, x, y):
    formula = y + '~' + x
    model = ols(formula, df).fit()
    f_value = model.fvalue
    p_value = model.f_pvalue
    return (f_value, p_value)

# getting f_value and p_value works with a single series.
get_ols_fp(df[df['c'].eq('CATS')], 'x', 'y')

上面的代码工作并获取 f_value 和 p_value。但是,以下方法不起作用。

# how could we run the get_ols with a groupby().agg() 
df.groupby('c').agg(get_ols_fp('x', 'y'))

在这种情况下,所需的输出将是“c”变量(“CATTS”和“DOGS”)的每级一行一行的数据帧,一列用于 p_value,另一列用于 f_value。

【问题讨论】:

    标签: pandas pandas-groupby aggregate apply


    【解决方案1】:

    这是有效的:

    def get_ols_fp(df, x=None, y=None):
        formula = y + '~' + x 
        model = ols(formula, df).fit()
        f_value = model.fvalue
        p_value = model.f_pvalue
        return pd.Series([f_value, p_value], index=['f_value', 'p_value'])
    
    df.groupby('c').apply(get_ols_fp, x='x', y = 'y')
    

    【讨论】:

    • 感谢您的帖子。接受这个作为更好的答案,因为它避免了 for 循环,按预期利用 group by 并且在更少的代码行中完成。
    【解决方案2】:

    我会做一些不同的事情。 我不知道这是否是最简单的方法,但它确实有效。

    例子:

    import pandas as pd
    import numpy as np
    from statsmodels.formula.api import ols
    
    n=100
    df = pd.DataFrame({
        'c': np.random.choice(['CATS', 'DOGS'], n),
        'x': np.random.choice(list('ABCDE'), n),
        'y': np.random.normal(5, 1, n)
    })
    
    signal = np.where(df['c'].eq('CATS') & df['x'].eq('A'), 1.1, 0)
    df['y'] = df['y'] + signal
    
    def get_ols_fp(df, x, y):
        formula = y + '~' + x
        model = ols(formula, df).fit()
        f_value = model.fvalue
        p_value = model.f_pvalue
        return (f_value, p_value)
    
    # getting f_value and p_value works with a single series.
    # get_ols_fp(df[df['c'].eq('CATS')], 'x', 'y')
    
    df_result = pd.DataFrame([], columns = ["c", "f_value", "p_value"])
    for c, dd in df.groupby(['c']):
        v = get_ols_fp(dd, 'x', 'y')
        df_result.loc[len(df_result)] = [c, *v]
    
    df_result
    

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      相关资源
      最近更新 更多