【问题标题】:using lambda for code efficiency in iterating over dataframe在迭代数据帧时使用 lambda 提高代码效率
【发布时间】: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


【解决方案1】:

我会构建一个包含您的状态和所需乘法因子的字典,然后迭代该字典以获得状态和成本因子元组,使用 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

【讨论】:

  • 为什么要循环遍历dictionary 而不是dataframe?如果字典包含所有 50 个州,但 dataframe 只有 4 个项目怎么办。这似乎效率低下,甚至可能导致错误。
猜你喜欢
  • 2015-12-23
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2010-10-27
  • 2012-04-26
相关资源
最近更新 更多