从列表创建lambda函数的方法

时间:2019-02-06 10:29:55

标签: python python-3.x pandas dictionary lambda

前言

尽管此问题引用了pandasnumpy软件包,但我认为解决方案不需要其中任何一个软件包的实用知识。

设置

我希望创建一个lambda函数的字典,以传递给pandas函数pandas.DataFrame.to_latex的formatter参数。

我希望lambda函数字典将浮点格式设置为列表指定的位数。

示例

我最想实现的目标可能是通过示例体现出来的。让我们设置一些我们想格式化的浮点数:

import numpy as np
import pandas as pd

y = np.array([[0.12345, 0.12345, 0.12345]])
colnames = ['col1', 'col2', 'col3']
df = pd.DataFrame(y, columns=colnames)

#print(df)
#      col1     col2     col3
#0  0.12345  0.12345  0.12345

太好了,现在我想将col1列的格式设置为小数点后1位。同样,我想将col2的格式设置为小数点后两位,而col3的格式显示3位。为此,我们设置一个列表:

digits = [1, 2, 3]

从该列表中,我们将创建一个lambda函数字典来格式化列,并在创建后测试这些函数。

fun = {}

for id, col in enumerate(['col1', 'col2', 'col3']):
    fun[col] = lambda x : '{{:.{}f}}'.format(digits[id]).format(x)
    print(fun[col](0.12345))
    # Prints 0.1, 0.12, 0.123 (looks to have worked!)

在上面的代码中,创建每个条目时都会显示出来,我已经实现了自己想要的。但是,再看一次,我发现我错了

print(fun['col1'](0.12345)) # Prints 0.123
print(fun['col2'](0.12345)) # Prints 0.123
print(fun['col3'](0.12345)) # Prints 0.123

我知道这些函数都将循环后的浮点格式设置为与digits[id] = 3相同。

我想更改我创建lambda函数的方式,以便我们改为观察:

print(fun['col1'](0.12345)) # Prints 0.1
print(fun['col2'](0.12345)) # Prints 0.12
print(fun['col3'](0.12345)) # Prints 0.123

是否可以这样做?我想象一种解决方案可能涉及使用eval,但我无法弄清楚。

显而易见的解决方案

pd.DataFrame.to_latex上下文之外,我们可以创建一个lambda函数,该函数接受两个参数并根据需要设置浮点格式:

fun = lambda x, digit : '{{:.{}f}}'.format(digit).format(x)

print(fun(0.12345, digits[0])) # Prints 0.1
print(fun(0.12345, digits[1])) # Prints 0.12
print(fun(0.12345, digits[2])) # Prints 0.123

但是,据我了解,传递给pd.DataFrame.to_latex的格式化程序函数可能仅包含一个参数,因此这样的解决方案将不可行。

1 个答案:

答案 0 :(得分:0)

您需要在循环时绑定float分辨率的值,否则3个lambda闭包引用相同的id变量,并且它们全部都获得分配给id的最后一个值。 / p>

使用functools.partial

的可能解决方案
def col_resolution(resolution, x):
    return '{{:.{}f}}'.format(resolution).format(x)

for id, col in enumerate(['col1', 'col2', 'col3']):
    fun[col] = partial(col_resolution, digits[id])

    # one line with lambda
    # fun[col] = partial(lambda res, x : '{{:.{}f}}'.format(res).format(x), digits[id])