首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这个使用petl的lambda函数有什么问题?

这个使用petl的lambda函数有什么问题?
EN

Stack Overflow用户
提问于 2018-06-07 04:48:55
回答 1查看 255关注 0票数 0

我有下表:

+----------------+---------+------------+
| Cambridge Data | IRR     | Price List |
+================+=========+============+
| '3/31/1989'    | '4.37%' |            |
+----------------+---------+------------+
| '4/30/1989'    | '5.35%' |            |
+----------------+---------+------------+

当剑桥数据中的日期是'4/30/1989‘时,我想转换表格并填充100的价目表。我使用petl实现了以下函数:

# Add an initial price to base calculations for Price List
def insert_initial_price(self, table):
    table = etl.convert(table, 'Price List', lambda v, row: v = '100' if row['Cambridge Parser'] == '3/31/1989', pass_row=True)
    return table

下面是一个使用petl文档中类似方法的示例:

>>> # conversion can access other values from the same row
... table12 = etl.convert(table1, 'baz',
...                       lambda v, row: v * float(row.bar),
...                       pass_row=True)
>>> table12
+-----+-------+--------------------+
| foo | bar   | baz                |
+=====+=======+====================+
| 'A' | '2.4' | 28.799999999999997 |
+-----+-------+--------------------+
| 'B' | '5.7' |              193.8 |
+-----+-------+--------------------+
| 'C' | '1.2' |               67.2 |
+-----+-------+--------------------+
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-07 04:58:04

您的函数有三个主要问题。

首先,您尝试为v赋值。但是赋值是语句,而不是表达式。在Python语言中,不能将语句放在表达式中,而lambda是一个表达式。但是你也可以直接使用def

def func(v, row):
    v = '100' if row['Cambridge Parser'] == '3/31/1989'
table = etl.convert(table, 'Price List', func, pass_row=True)

其次,'100' if row['Cambridge Parser'] == '3/31/1989'在Python语言中不是有效的表达式。if语句可能不需要else,但if表达式需要。因此,它必须看起来更像这样:

def func(v, row):
    v = '100' if row['Cambridge Parser'] == '3/31/1989' else v
table = etl.convert(table, 'Price List', func, pass_row=True)

…或者:

def func(v, row):
    if row['Cambridge Parser'] == '3/31/1989':
        v = '100'
table = etl.convert(table, 'Price List', func, pass_row=True)

最后,即使解决了这个问题,为v赋值也不会有任何好处。v只是函数的参数名称。将该名称重新绑定到其他值是没有意义的;一旦退出函数,该参数就不再存在。特别是,它不会对传递给函数的任何值产生任何影响。

如果您查看示例函数,它不会尝试赋值任何内容,它只返回新值。这就是你想要在这里做的。所以,要么:

def func(v, row):
    if row['Cambridge Parser'] == '3/31/1989':
        return '100'
    else:
        return v
table = etl.convert(table, 'Price List', func, pass_row=True)

…或者,如果您想让它尽可能简洁,即使这意味着您不理解自己的代码:

table = etl.convert(table, 'Price List', lambda v, row: '100' if row['Cambridge Parser'] == '3/31/1989' else v, pass_row=True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50729365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档