首页 > 解决方案 > 在函数中调整 Pandas DF 的正确格式

问题描述

新程序员来了。我有一个熊猫数据框,我根据某些条件进行调整。当某些条件满足时,我使用函数来调整值。我使用函数是因为如果函数在多个位置使用,则更容易调整一次功能代码,而不是在代码的不同位置多次进行相同的调整。我的问题集中在制作这些功能时什么被认为是最佳实践。

所以我在下面包含了四个示例函数。第一个示例函数有效,但我想知道它是否被认为是糟糕的做法来构造它,而是使用其他变体之一。请让我知道什么被认为是“适当的”,以及您是否有任何其他意见。作为一个快速的旁注,我只会使用一个“数据框”。否则我至少会通过数据框作为输入。

谢谢!

dataframe = pd.DataFrame #Some dataframe

#version 1 simplest
def adjustdataframe():
    dataframe.iat[0,0] = #Make some adjustment

#version 2 return dataframe
def adjustdataframe():
    dataframe.iat[0,0] = #Make some adjustment
    return dataframe

#version 3 pass df as input but don't explicitly return df
def adjustdataframe(dataframe):
    dataframe.iat[0, 0] =  # Make some adjustment

#version 4 pass df as input and return df
def adjustdataframe(dataframe):
    dataframe.iat[0, 0] =  # Make some adjustment
    return dataframe

标签: pythonpandas

解决方案


一般来说,我认为在你的 python 代码中使用版本 1版本 2是不合适的,因为通常*它会引发UnboundLocalError: local variable referenced before assignment错误。例如,尝试运行以下代码:

def version_1():
    """ no parameters & no return statements """
    nums = [num**2 for num in nums]


def version_2():
    """ no parameters """
    nums = [num**2 for num in nums]
    return nums


nums = [2,3]
version_1()
version_2()

版本3 和 4在这方面很好,因为它们引入了参数,但第三个函数不会改变任何东西(它会改变函数内的局部变量,但调整不会在全局范围内发生,因为它们永远不会离开局部范围) .

def version_3(nums):
    """ no return """
    nums = [num**2 for num in nums] # local variable

nums = [2,3] # global variable
version_3(nums)
# would result in an error
assert version_3(nums) == [num**2 for num in nums]

由于版本 4有一个 return 语句,因此将在本地范围内进行调整

def version_4(nums):
    nums = [num**2 for num in nums]
    return nums

new_nums = version_4(nums)
assert new_nums == [num**2 for num in nums]

# but original `nums` was never changed
nums

所以,我相信version_4这是最好的做法。


*通常 - 就一般 python 函数而言;对于pandas对象,情况有所不同:所有四个函数都将导致一个专门称为dataframe被更改变量(您通常不想这样做):

def version_1():
    dataframe.iat[0,0] = 999 

def version_2():
    dataframe.iat[0,0] = 999 
    return dataframe

dataframe = pd.DataFrame({"values" : [1,2,3,4,5]})
version_1()
dataframe
dataframe = pd.DataFrame({"values" : [1,2,3,4,5]})
version_2()
dataframe

NameError如果你的变量被不同地调用,这两个函数都会抛出;dataframe尝试在不事先定义对象的情况下运行您的第一个或第二个函数(df例如用作变量名):

# restart your kernel - `dataframe` object was never defined
df = pd.DataFrame({"values" : [1,2,3,4,5]})
version_1()
version_2()

使用version_3and version_4,您会期待不同的结果。

def version_3(dataframe):
    dataframe.iat[0, 0] = 999

def version_4(dataframe):
    dataframe.iat[0, 0] = 999 
    return dataframe

df = pd.DataFrame({"values" : [1,2,3,4,5]})
version_3(df) 
df

df = pd.DataFrame({"values" : [1,2,3,4,5]})
version_4(df)
df

但结果是一样的:您的原始数据框将原地更改。

为避免这种情况,请不要忘记复制您的数据框:

def version_4_withcopy(dataframe):
    df = dataframe.copy()
    df.iat[0, 0] = 999 
    return df

dataframe = pd.DataFrame({"values" : [1,2,3,4,5]})
new_dataframe = version_4_withcopy(dataframe)
dataframe
new_dataframe

推荐阅读