我有一个熊猫数据框。我想在数据框中创建新列 现有列的数学函数值。
我知道在简单情况下该怎么做:
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))']
。有什么办法可以使用这些新功能创建类似于第一个示例的列?
答案 0 :(得分:2)
这看起来是一个糟糕的设计,但我不会走这条路。
回答您的问题,您可以使用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))