首页 > 解决方案 > 如何评估 DataFrame 中包含的逐行表达式(如 df.eval() 但动态)?

问题描述

假设您有一个 DataFrame,其中有一列包含表达式(指其他列),是否可以评估该列中包含的表达式?

我知道可以使用pd.eval()df.eval()应用按列操作(如下所示)。示例取自:

https://jakevdp.github.io/PythonDataScienceHandbook/03.12-performance-eval-and-query.html

假设你有:

import pandas as pd
df = pd.DataFrame([[1, 2], [2, 3], [5, 6]], columns=['A', 'B'])

然后你可以写:

df.eval('(A + B)')

你会得到一个系列3, 5, 11(预期)。

现在,如果该表达式实际上因行而异并且实际上存储为列,该怎么办?比如这个数据框:

df = pd.DataFrame([[1, 2, "A + B"], [2, 3, "A - B"], [5, 6, "A + 2 * B"]], columns=['A', 'B', 'C'])

如何评估 C 列中的表达式?

这种情况下的预期结果是一系列3, -1, 17.

谢谢你的帮助。

标签: pythonpandas

解决方案


利用

>>> np.diag(df.C.apply(df.eval).values)

array([ 3, -1, 17])

即使这是一个糟糕的设计 IMO,因为您是 I)在字符串中硬编码操作,使得在需要时更难操作它,II)将这些操作作为字符串存储在 pandasDataFrame中,这对于许多字符串来说很慢-涉及的操作。


推荐阅读