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