python - 使用 lambda 提高迭代数据帧时的代码效率

标签 python python-2.7 pandas lambda

我正在尝试消除用于修改 Pandas 数据帧 中的值的过多 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

最佳答案

我会构建一个包含您的状态和所需乘法因子的字典,然后迭代该字典以获取状态和成本因子元组,使用 loc 和 bool 掩码有选择地仅乘以这些行在你的 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

关于python - 使用 lambda 提高迭代数据帧时的代码效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31542657/

相关文章:

python - csv: writer.writerows() 拆分我的字符串输入

python - 根据 csv 文件创建的列表将文件从一个目录复制到另一个目录

python-2.7 - 了解 Python 中一行中的多个变量赋值

python - odoo公​​司可以共享同一个合作伙伴吗?在哪些情况下?

Python对象初始化,__init__方法

Python pandas 更改数据框值

Python MySQLDBexecutemany()在mac上工作,在linux上不执行任何操作

python - 使用 pandas 将两个不同的数据帧转换为一个 json 文件

python - 为什么我在 matplotlib 中得到额外的空图?

python - 如何计算累计平均收入? Python