调整功能中的熊猫DF的正确格式

时间:2020-01-12 20:35:20

标签: python pandas

这里是新程序员。我有一个熊猫数据框,可以根据某些if条件进行调整。如果满足条件,我将使用函数来调整值。我之所以使用函数,是因为如果在多个位置使用该函数,则只需一次调整功能代码,而不是在代码的不同位置多次进行相同的调整,就容易了。我的问题集中在实现这些功能时被认为是最佳实践。

因此,我在下面包括了四个示例函数。第一个示例函数有效,但是我想知道它是否被认为是不好的做法来像这样构造它,而是使用其他变体之一。请让我知道什么是“适当的”,以及您是否还有其他意见。作为一个简短的说明,我将永远只使用一个“数据框”。否则,我至少会将数据框作为输入传递。

谢谢!

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

1 个答案:

答案 0 :(得分:2)

通常,我认为在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 在这方面很不错,因为它们引入了参数,但是第三个函数不会更改任何内容(它会更改函数中的局部变量,但是调整会't 是全球性的,因为它们从不离开本地范围。

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的变量被更改(您通常不想这样做):< / p>

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