首页 > 解决方案 > 我希望能够创建一个多项式函数,使用数据框列名作为术语,将列值作为它们的幂

问题描述

我希望能够使用数据框列名作为术语和列值作为它们的幂来创建多项式函数,我在下面添加了一个关于我正在寻找的示例,但不幸的是,关于如何做

在此处输入图像描述

只是为了补充一点,我有一个单独的数据文件,其中包含我将要输入的列名,我只想能够遍历每一行并创建一个最终函数,不确定是否可能但硬编码这很痛苦而且非常耗时,任何输入都是有帮助的

标签: pandas

解决方案


举个df例子:

   coefficient  Term1  Term2
0           25      1      0
1           36      2      0
2          -16      0      0
3            4      2      1

和一个dfv带有值的数据框:

   Term1  Term2
0      0      1
1      2      0
2      3      0

你可以做

dfv.apply(lambda x: (np.c_[df.coefficient, x.to_numpy()**df.iloc[:,1:]]).prod(1).sum(), 1)

要得到

0    -16
1    178
2    383

您的示例数据的完整可重现示例:
import pandas as pd
import numpy as np

np.random.seed(1)
term_cols = [f'Term{i}' for i in range(1,8)]
df = pd.DataFrame([[ 25,   1,   0,   0,   0,   0,   0,   0],
                   [ 36,   2,   0,   2,   0,   0,   0,   1],
                   [-16,   0,   0,   0,   0,   0,   1,   2],
                   [  4,   2,   1,   1,   0,   0,   0,   0]],
                  columns=['coefficient']+term_cols)

dfv = pd.DataFrame(np.random.randint(0, 5, (3,len(term_cols))), columns=term_cols)

print(dfv[term_cols].apply(lambda x: (np.c_[df.coefficient, x.to_numpy()**df[term_cols]]).prod(1).sum(), 1))

结果:

0       75
1      985
2    37220

更新:根据评论中的要求,这里与公式相同:
s = ''
for r in df.iterrows():
    r = r[1].loc[r[1].ne(0)]
    s += f'{r[0]:+d}*' + '*'.join([f'(dfv.loc[i,"{k}"]**{v})' if v > 1 else f'(dfv.loc[i,"{k}"])' for k,v in zip(r[1:].index.tolist(), r[1:].tolist())])
    
print(s)

for i in dfv.index:
    print(eval(s))

输出:

+25*(dfv.loc[i,"Term1"])+36*(dfv.loc[i,"Term1"]**2)*(dfv.loc[i,"Term3"]**2)*(dfv.loc[i,"Term7"])-16*(dfv.loc[i,"Term6"])*(dfv.loc[i,"Term7"]**2)+4*(dfv.loc[i,"Term1"]**2)*(dfv.loc[i,"Term2"])*(dfv.loc[i,"Term3"])

75
985
37220

推荐阅读