在python中,使用函数的参数重命名变量

2024-04-26 00:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个函数。这个函数的一个输入是panda数据帧,它的任务之一是对这个数据帧的两个变量进行一些操作。这两个变量是不固定的,我想有自由来确定他们使用参数作为函数的输入。你知道吗

例如,假设在某个时刻我想使用的变量是“var1”和“var2”(但在另一个时候,我可能想使用其他两个变量)。假设这些变量取1,2,3,4,我想通过var1==1和var2==1来减少df。我的功能是这样的

def fun(df , var = ['input_var1', 'input_var2'] , val):
    df = df.rename(columns={  var[1] : 'aux_var1 ', var[2]:'aux_var2'})

    # Other operations
    df  = df.loc[(df.aux_var1 == val ) & (df.aux_var2 == val )] 
    # end of operations

    # recover 
    df = df.rename(columns={ 'aux_var1': var[1] ,'aux_var2': var[2]})
    return df 

当我使用函数fun时,我有一个错误

fun(df, var = ['var1','var2'], val = 1)
IndexError: list index out of range

实际上,我想做其他更复杂的操作,我没有描述这些操作,以免扩展问题。也许上面这个简单的例子有一个不需要重命名变量的解决方案。但也许这个解决方案不适用于我真正想做的手术。因此,首先,我必须纠正重命名变量时的错误。如果您想提供另一个不需要重命名的更优雅的解决方案,我也很感激,但是如果除了优雅的解决方案之外,您还提供有关重命名的解决方案,我将非常感激。你知道吗


Tags: columns数据函数dfinputvarval解决方案
3条回答

Python列表是零索引的,即第一个元素索引是0。 换句台词:

df = df.rename(columns={  var[1] : 'aux_var1 ', var[2]:'aux_var2'})

df = df.rename(columns={ 'aux_var1': var[1] ,'aux_var2': var[2]})

df = df.rename(columns={  var[0] : 'aux_var1 ', var[1]:'aux_var2'})

df = df.rename(columns={ 'aux_var1': var[0] ,'aux_var2': var[1]})

分别

在本例中,您正在访问var[2],但是Python中的2元素列表包含元素0和1。元素2不存在,因此访问它超出范围。你知道吗

正如在其他答案中提到的,您收到的错误是由于Python列表的0索引造成的,也就是说,如果您希望访问列表的第一个元素var,那么您可以使用0索引而不是1索引:var[0]。你知道吗

但是,对于重命名主题,您可以在不进行任何列重命名的情况下执行数据帧的过滤。我可以看到您正在访问列作为dataframe的一个属性,但是您可以通过使用__getitem__方法来实现这一点,这种方法更常用于方括号,例如df[var[0]]。你知道吗

如果您希望在不进行任何重命名的情况下对函数有更多的通用性,我可以建议:

from functools import reduce

def fun(df , var, val):
    _sub = reduce(
                  lambda x, y: x & (df[y] == val), 
                  var, 
                  pd.Series([True]*df.shape[0])
                 )
    return df[_sub]

这将适用于任意数量的输入列变量。希望这能对你打算做的更复杂的手术起到启发作用。你知道吗

相关问题 更多 >