我有一个熊猫数据帧。我想在数据框中使用现有列的数学函数值创建新列。
我知道如何处理简单的情况:
import pandas as pd
import numpy as np
# Basic dataframe
df = pd.DataFrame(data={'col1': [1,2], 'col2':[3,5]})
for i in df.columns:
df[f'{i}_sqrt'] = df[i].apply(lambda x :np.sqrt(x))
产生
现在我想将它扩展到函数被编写为字符串的情况:
one_func = ['(x)', '(np.sqrt(x))']
two_func = ['*'.join(i) for i in itertools.product(one_func, one_func)]
这样two_func = ['(x)*(x)','(x)*(np.sqrt(x))','(np.sqrt(x))*(x)', '(np.sqrt(x))*(np.sqrt(x))']
。有没有什么办法可以用这些新函数创建第一个例子的列?
这看起来像一个糟糕的设计,但我不会走那条路。
回答你的问题,你可以使用df.eval
首先,设置
one_func = ['{x}', '(sqrt({x}))']
使用{}
而不是()
,以便您可以将{x}
替换为您的实际列名。
然后,例如,
expr = two_func[0].format(x='col1')
df.eval(expr)
食物循环你的样子
for col in df.columns:
for func in two_func: df[func] = df.eval(func.format(x=col))