Python 迭代唯一列值以创建数据帧,在子数据帧上运行函数并保存为单个concat

Python 迭代唯一列值以创建数据帧,在子数据帧上运行函数并保存为单个concat,python,pandas,for-loop,Python,Pandas,For Loop,我有一个主数据框,它有数百个键值,格式如下: Key,Val1,Val2 a,1,w a,2,w a,3,e b,1,g b,2,d 其思想是创建一个循环,为每个唯一的键值创建一个新的数据帧: Key,Val1,Val2 a,1,w a,2,w a,3,e 并在此数据帧上执行一个函数,然后创建一个新的数据帧,它是从唯一键值获得的所有新数据帧的集合。因此,如果函数为avg和中值除以val 2,则输出如下所示: a b avg 1 1 med 2 2

我有一个主数据框,它有数百个键值,格式如下:

Key,Val1,Val2
a,1,w
a,2,w
a,3,e
b,1,g
b,2,d
其思想是创建一个循环,为每个唯一的键值创建一个新的数据帧:

Key,Val1,Val2
a,1,w
a,2,w
a,3,e
并在此数据帧上执行一个函数,然后创建一个新的数据帧,它是从唯一键值获得的所有新数据帧的集合。因此,如果函数为avg和中值除以val 2,则输出如下所示:

     a     b
avg  1      1
med  2      2
我想到的代码是,函数dataframe保存在
dffinal

def regression():
    X=Final.iloc[:,7:-1].copy()
    y=Final[['Sale Rate']].copy()
    X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=.2, random_state=0)
    sel=f_classif(X_train, y_train)
    p_values=pd.Series(sel[0], index=X_train.columns)
    p_values=p_values.reset_index()
    pd.options.display.float_format = "{:,.2f}".format
    return p_values

Final.groupby('Key').agg([regression]).T
请指出我到底哪里会出错,我不知道该怎么做

错误:

ValueError: no results

数据结构示例:

如果我理解正确,请使用

df.groupby('Key')['Val1'].agg(['mean', 'median']).T
并根据需要重命名index/cols

演示:


使用自定义函数进行聚合

def custom1(values):
    return values.sum()*100

def custom2(values):
    return values.max() - values.min()
演示:

自定义名称:

>>> df.groupby('Key')['Val1'].agg([('foo', custom1), ('bar', custom2)]).T
Key    a    b
foo  600  300
bar    2    1

为什么
a的
avg
值是
1
?它不应该是
(1+2+3)/3=2
?这是你想要的吗<代码>df.groupby('Key')['Val1'].agg(['mean','median']).T
。使用我放置的实际列
'Val1'
。请忽略这些值,我没有输入准确的值,因为这可能是一个egIt,但我需要一些函数不可知的东西,所以请您建议在for循环中进行更改。好的,可以使用这个,但在其他一些用例中,这不起作用,如果我对这些值进行回归,并将beta系数存储在新的数据框中,这种方法就不会起作用work@KarthikApadodharanan为什么不?因为我不能定义一个函数来运行回归,很抱歉我不清楚。@KarthikApadodharanan为什么你不能定义一个函数来运行回归?我不知道你可以,是否可以定义一个函数来运行回归并将结果存储在数据框中;这样,函数的输出就是数据帧中的F统计值
>>> df.groupby('Key')['Val1'].agg([custom1, custom2]).T
Key        a    b
custom1  600  300
custom2    2    1
>>> df.groupby('Key')['Val1'].agg([('foo', custom1), ('bar', custom2)]).T
Key    a    b
foo  600  300
bar    2    1