Python 根据行与行之间更改的计算创建新列?
我想计算一个给定日期的变量总和。每天都包含不同的计算,但所有的日子都一致地使用变量 有一个df指定我的变量,还有一个df指定根据日期计算的变化 如何创建一个包含这些不同方程式答案的新列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
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