【问题标题】:Python Pandas Group applyPython Pandas Group 申请
【发布时间】:2021-07-08 00:22:01
【问题描述】:

我有一个经常使用的功能。我有一组数据,我想按某些列进行分组,然后对其应用一个函数以从中获取一个新的数据框。

假设我有一个包含三列的数据集:

Channel | threshold | Counts

我想按频道编号进行分组,并对每个组进行高斯拟合。然后为每个组获取一个值。

df_gauss  = grp.group_apply(df_new, ["Channel"] ,['mean', 'std',"A"],gauss_fit, ["thr","scaler"] ,[100., 3400., 1.] )

函数的实现看起来像这样并且工作正常,我只是想知道是否有更好的方法来做到这一点。特别是,有什么好的方法可以避免dummyVariableName 的“黑客攻击”吗?

import numpy
from scipy.optimize import curve_fit
import pandas as pd

def gauss(x, *p):
    A, mu, sigma = p
    return A*numpy.exp(-(x-mu)**2/(2.*sigma**2))

def gauss_fit(x,y, p0):
    coeff, var_matrix = curve_fit(gauss,x, y, p0=p0)
    return coeff[1], coeff[2],coeff[0]

def group_apply(df, groupAxis, output_axis, func, input_axis, *args, **kwargs):
    def wrapped_fun(df, input_axis,*args, **kwargs):
        df_input = [df[x].to_numpy() for x in input_axis]
        return func(*df_input, *args, **kwargs)
    df1 = df.groupby(groupAxis).apply(wrapped_fun, input_axis, *args, **kwargs)  
    dummyVariableName = 'internal_dummy_name'
    df2 = df1.reset_index(name=dummyVariableName)
    df2[output_axis] = pd.DataFrame(df2[dummyVariableName].to_list(), columns=output_axis)
    df2 = df2.drop([dummyVariableName],axis=1)
    return df2

【问题讨论】:

  • if there is a better way - 在哪方面更好?你想改进什么?您不喜欢您的解决方案的哪些方面?
  • 我希望 Pandas 中有一个内置函数可以做到这一点。还有 reset_index 的东西看起来有点“hacky”

标签: python pandas numpy


【解决方案1】:

您可以更改wrapped_fun 以返回Series 而不是元组,以避免internal_dummy_name 的诡计。这样,您还可以使用将as_index=False 添加到groupby 以避免使用任何reset_index

代码:

def group_apply(df, groupAxis, output_axis, func, input_axis, *args, **kwargs):
    def wrapped_fun(df):
        df_input = [df[x].to_numpy() for x in input_axis]
        return pd.Series(func(*df_input, *args, **kwargs), index=output_axis)
    return df.groupby(groupAxis, as_index=False).apply(wrapped_fun)

请注意,wrapped_fun 不需要将 input_axis*args**kwargs 作为参数,因为它们已经“在范围内”。

【讨论】:

  • 谢谢您的解决方案看起来非常好,但输出有些不同:输出数据帧仍然分组。与我的原始版本一样,输出数据帧只是一个没有分组的普通数据帧。
  • @Argg:我的测试对两个代码给出了相同的结果,但这可能是由于输入差异造成的。您能否在问题中添加一个简短的输入/输出示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2021-05-13
  • 2020-06-05
  • 1970-01-01
相关资源
最近更新 更多