2015-07-21 70 views
1

我正试图消除用于修改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 
+0

取而代之的是这些lambda表达式,为什么不为这个因子创建一个字典{''CT':1.4,...}',并且像'project [2] * = factors [project [1]]'一样调用? –

+0

为什么不只是做一个多对一的合并来为每个状态'CT MA CA'创建一列常量'1.4 1.1 1.5'并且按列进行计算。逐行迭代会慢一点。 –

回答

2

我想构建你的状态的字典和期望倍增因子,只是遍历字典来获得状态和成本因子元组,请使用loc和布尔值掩码来选择性地仅乘以df中的那些行:

In [185]: 
d = {'CT':1.4, 'MA':1.1, 'CA':1.5} 
for item in d.items(): 
    df.loc[df['State'] == item[0], 'Cost'] *= item[1] 
df 

Out[185]: 
    Project ID State Cost 
0 Project1 CT 1120 
1 Project2 MA 1100 
2 Project3 CA 30 
+0

为什么要循环访问'dictionary'而不是'dataframe'?如果字典具有全部50个状态,但'dataframe'只有4个项目会怎样。这似乎效率低下,甚至可能导致错误。 – user2242044