我有一个由一列中的多项式1d对象组成的数据帧,我想对数据帧进行分组,然后对该组中的所有多项式系数求和,并除以该组中的行数。
但是,我在使用poly1d对象时遇到了困难。
agg coeffs
0 1.91
1 88.76
2 2.5
上面的函数在单独的行中输出修改后的系数,但我希望它们都在同一行,保留为poly1d对象(不是数组或列表)。
输出错误:
coeffs A B
10227 [0.0767614738203, 91.6253393665] 2016 p1
10311 [4.47454751131, 44.9313348416] 2016 p2
10367 [2.38170652877, 133.884680026] 2016 p3
10309 [0.736288998358, 84.6403688266] 2016 p4
示例数据框:
coeffs A B
0 [1.91, 88.76] 2016 p1
注意:与poly1d对象一样,“coeffs”列中的单元格如下所示: 0.0767614738203 x2 + 91.6253393665 + 10(截距不显示在数据框中,但是当单元格从df中进行子集化时会出现截距。
预期输出:
def agg_coeffs(df):
g_all = pd.DataFrame()
for key, g in df.groupby(['A', 'B']):
g.loc[:,'agg coeffs'] = sum(g['coeffs']) / len(g['coeffs'])
g_all = pd.concat([g_all, g])
return g_all
将函数更改为此(删除列表包装器):
g.loc[:,'agg coeffs'] = sum(g['coeffs']) / len(g['coeffs']
在{{1}}行上产生此错误:
ValueError:设置时必须具有相等的len键和值 可迭代
答案 0 :(得分:1)
将系数拆分为常规数字列:
df['c1'] = df['c2'] = df['c3'] = np.nan
df[['c1', 'c2', 'c3']] = [x.c for x in df.coeff]
然后是groupby和agg:
grouped = df.groupby('A', as_index=False)
df2 = grouped.agg({'B':'first', 'c1':'mean', 'c2':'mean', 'c3':'mean'})
给你:
A B c1 c2 c3
0 2016 p1 1.917326 88.770431 2.5
然后组合回poly1d对象:
df2['coeff'] = df2[['c1','c2','c3']].apply(np.poly1d, axis=1)
给你:
A B c1 c2 c3 coeff
0 2016 p1 1.917326 88.770431 1.0 [1.91732612805, 88.7704307652]
但请注意:poly1d包含引用,而不是其参数的副本,因此如果删除c1 / c2 / c3列,它将损坏coeff。您可以通过在应用期间复制poly1d参数来解决此问题。