Python 根据行与行之间更改的计算创建新列?

Python 根据行与行之间更改的计算创建新列?,python,pandas,numpy,Python,Pandas,Numpy,我想计算一个给定日期的变量总和。每天都包含不同的计算,但所有的日子都一致地使用变量 有一个df指定我的变量,还有一个df指定根据日期计算的变化 如何创建一个包含这些不同方程式答案的新列 import pandas as pd import numpy as np conversion = [["a",5],["b",1],["c",10]] conversion_table = pd.DataFrame(conversion,columns=['Variable','Cost']) data

我想计算一个给定日期的变量总和。每天都包含不同的计算,但所有的日子都一致地使用变量

有一个df指定我的变量,还有一个df指定根据日期计算的变化

如何创建一个包含这些不同方程式答案的新列

import pandas as pd
import numpy as np

conversion = [["a",5],["b",1],["c",10]]
conversion_table = pd.DataFrame(conversion,columns=['Variable','Cost'])

data1 = [[1,"3a+b"],[2,"c"],[3,"2c"]]
to_solve = pd.DataFrame(data1,columns=['Day','Q1'])

desired = [[1,16],[2,10],[3,20]]
desired_table=pd.DataFrame(desired,columns=['Day','Q1 solved'])

我已经根据行分离了变量和方程。我可以循环使用这些方程来找到非数值并重新分配它们吗

#separate out equations and values 

for var in conversion_table["Variable"]:
    cost=(conversion_table.loc[conversion_table['Variable'] == var, 'Cost']).mean()

for row in to_solve["Q1"]:
    equation=row


一个简单的建议,也许您需要重写代码的一部分。不确定您是否想要这样的东西:

a = 5
b = 1
c = 10

# Rewrite the equation that is readable by Python
# e.g. replace 3a+b by 3*a+b
data1 = [[1,"3*a+b"],
         [2,"c"],
         [3,"2*c"]]

desired_table = pd.DataFrame(data1,
                        columns=['Day','Q1'])
desired_table['Q1 solved'] = desired_table['Q1'].apply(lambda x: eval(x))
desired_table
输出:

   Day     Q1  Q1 solved
0    1  3*a+b         16
1    2      c         10
2    3    2*c         20

如果可以使用
*
将方程式更改为方程式,则可以执行此操作

mapping=dict(zip(转换表['Variable'],转换表['Cost'])

函数的值,并用映射中的数值替换变量

desired_table['Q1 solved'] = to_solve['Q1'].map(lambda x: eval(''.join([str(mapping[i]) if i.isalpha() else str(i) for i in x])))

我不确定我是否理解,你能展示你预期的输出数据框吗?输出数据框是:期望的表格哦,好的,
3a
是否可以重写为
3*a
,以便可以使用eval?是的,方程可以重写。我提交了一个可能的解决方案,请验证。谢谢你给我展示eval(x)部分!是的,我可以在data1 df中重新编写这些等式,但我想知道如何从它们的数据帧中删除成本变量。(我将在许多文件中执行此操作,并且无法单独分配变量)。不过,对于最后一行的工作,我认为最后一行应该是:所需的_表['Q1已解决']=to_已解决['Q1'].应用(λx:eval(x))这在示例中起作用--谢谢!您能澄清一下吗,在我的实际数据表中,我得到了以下错误:“float”对象不可iterable。此代码是否仍能在那里工作?当某些行中存在NaN值时,会出现问题--是否有方法使用此代码并跳过这些值?我会在运行之前过滤掉这些NaN行这段代码,
df[df['Q1'].notnull()]
@user11548079您找到了一个可以接受的答案,所以这个问题可以结束了吗
0    16
1    10
2    20