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

时间:2018-06-06 20:48:55

标签: python petl

我有下表:

+----------------+---------+------------+
| 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 |
+-----+-------+--------------------+

1 个答案:

答案 0 :(得分:1)

您的功能有三个主要问题。

首先,您尝试为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)

...或者,如果你想尽可能简洁,即使这意味着你不了解自己的代码:

**T1**      

object  Value   Calculated_Name 

AA       10 
BB       100    
CC       150    

**T2**  

R1  R2     Name

1   15      Z
16  130     w