Python:聚合poly1d对象并插入新的DataFrame列

时间:2018-02-26 13:13:20

标签: python pandas numpy

我有一个由一列中的多项式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键和值   可迭代

1 个答案:

答案 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参数来解决此问题。