【发布时间】:2015-07-21 14:57:48
【问题描述】:
我试图消除用于修改 Pandas dataframe 中值的过多 if 语句。我最终会为每个状态创建一个,这是很多代码,并且每次都会为每个状态执行 if 语句。当我的数据源是列表格式时,我成功使用lambda 使代码高效。这在第一个代码块中得到了演示。我正在尝试使用dataframe 中的数据复制它,但不确定如何。
带列表的高效代码:
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]]一样调用? -
为什么不直接进行多对一合并来为每个状态
1.4 1.1 1.5创建一列常量CT MA CA并按列进行计算。逐行迭代会慢一些。
标签: python python-2.7 pandas lambda