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
推荐阅读
- javascript - 下拉菜单导航栏问题
- php - 在 sprintf 中添加 html
- npm-install - 无法在 Windows 中安装 npm。已安装node@12
- r - @-登录输出/列表
- google-app-engine - 无法在谷歌应用引擎上部署最小的静态站点
- visual-c++ - 如何使用 Visual Studio C++ 中的 uWebsockets?
- python - 为什么 print(users_dict.get("bob")) 和 print(users_dict.get(users[0].username)) 打印不同的结果?
- javascript - 从 Node 到浏览器,提供和播放 wav 音频文件的不同方式的优缺点
- firebase - InkWell 的 onTap() 未触发
- python - SQL 查询使用 group by 和 aggegate 函数创建具有现有数据操作和操作的新表