我有一个由一列中的多项式 1d 对象组成的数据框,我想对数据框进行分组,然后将组中的所有多项式系数求和并除以组中的行数。
但是,我在处理 poly1d 对象时遇到了困难。
def agg_coeffs(df):
g_all = pd.DataFrame()
for key, g in df.groupby(['A', 'B']):
agg_coeffs = pd.DataFrame({"agg coeffs":list(sum(g['coeffs']) / len(g['coeffs']))})
g_all = pd.concat([g_all, agg_coeffs])
return g_all
上面的函数在不同的行中输出修改后的系数,但我希望它们都在同一行中并保留为 poly1d 对象(而不是数组或列表)。
错误的输出:
agg coeffs
0 1.91
1 88.76
2 2.5
示例数据框:
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
注意:与 poly1d 对象一样,“coeffs”列中的单元格如下所示:0.0767614738203 x2 + 91.6253393665 + 10(截距不显示在数据框中,但当单元格从 df.
预期输出:
coeffs A B
0 [1.91, 88.76] 2016 p1
将函数更改为此(删除列表包装器):
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']
):
ValueError:使用可迭代对象设置时必须具有相等的 len 键和值
将系数拆分为常规数字列:
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 参数来解决此问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句