我正试图消除用于修改Pandas dataframe
中的值的过多if语句。每个状态最终都会有一个状态,每个状态都会执行很多代码和if语句。当我的数据源处于列表格式时,我成功使用lambda
来使代码高效。这在第一个代码块中得到了证明。我试图用dataframe
中的数据复制它,但我不知道如何。在迭代数据框时使用lambda代码效率
高效的代码使用列表:
Projects = [['Project1', 'CT', 800], ['Project2', 'MA', 1000], ['Project3', 'CA', 20]]
for project in Projects:
project[2] = {
'CT': lambda: [project[2] * 1.4],
'MA': lambda: [project[2] * 1.1],
'CA': lambda: [project[2] * 1.5]
}[project[1]]()
print Projects
低效的代码与dataframe
:
import pandas as pd
df = pd.DataFrame(data = [['Project1', 'CT', 800], ['Project2', 'MA', 1000], ['Project3', 'CA', 20]], columns=['Project ID', 'State', 'Cost'])
for project_index, project in df.iterrows():
if project['State'] == 'CT':
df.ix[project_index, 'Cost'] *= 1.4
if project['State'] == 'MA':
df.ix[project_index, 'Cost'] *= 1.1
if project['State'] == 'CA':
df.ix[project_index, 'Cost'] *= 1.5
print df
取而代之的是这些lambda表达式,为什么不为这个因子创建一个字典{''CT':1.4,...}',并且像'project [2] * = factors [project [1]]'一样调用? –
为什么不只是做一个多对一的合并来为每个状态'CT MA CA'创建一列常量'1.4 1.1 1.5'并且按列进行计算。逐行迭代会慢一点。 –