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

2024-06-28 19:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由多项式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对象(而不是数组或列表)。在

错误输出:

^{pr2}$

示例数据帧:

                 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.625393665+10(截距不显示在数据帧中,但在从测向分组的小区中出现截距。在

预期输出:

                 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: Must have equal len keys and value when setting with an iterable


Tags: 数据对象keydataframedfforlendef
1条回答
网友
1楼 · 发布于 2024-06-28 19:22:15

拆分为常规数值列:

df['c1'] = df['c2'] = df['c3'] = np.nan
df[['c1', 'c2', 'c3']] = [x.c for x in df.coeff]

然后是groupby和agg:

^{pr2}$

给你:

      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。如果需要,可以通过在apply期间复制poly1d参数来解决这个问题。在

相关问题 更多 >