【问题标题】:Create a new column based on calculations that change between rows?根据行间变化的计算创建一个新列?
【发布时间】:2020-05-19 03:43:59
【问题描述】:

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

有一个 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

【问题讨论】:

  • 我不确定我是否理解,你能显示你预期的输出数据框吗
  • 输出数据框为:desired_table
  • 哦,好的,3a可以改写成3*a这样eval就可以用了吗?
  • 是的,方程可以改写
  • 好的,我提交了一个可能的解决方案,请验证

标签: python pandas numpy


【解决方案1】:

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

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

【讨论】:

  • 嗯,好的。感谢您向我展示 eval(x) 部分!是的,我可以在 data1 df 中重写这些方程,但我想知道如何从他们的数据框中删除成本变量。 (我将对许多文件执行此操作,并且不能单独分配变量)但要使最后一行正常工作,我认为最后一行应该是:desired_table['Q1solved'] = to_solve['Q1'].apply(lambda x: eval(x))
【解决方案2】:

如果可以将方程式更改为带有* 的方程式,那么您可以这样做。

获取映射

mapping = dict(zip(conversion_table['Variable'], conversion_table['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])))
0    16
1    10
2    20

【讨论】:

  • 这适用于示例——谢谢!您能否澄清一下,在我的实际数据表中,我收到以下错误:'float' object is not iterable。这段代码还能在那里工作吗?
  • 当某些行中有 NaN 值时会出现问题——有没有办法使用此代码并跳过这些值?
  • 我会在运行该代码之前过滤掉那些 NaN 行,df[df['Q1'].notnull()]
  • @user11548079 你有没有找到一个可以接受的答案,所以这个问题可以结束了
最近更新 更多