【发布时间】: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”