这里是新程序员。我有一个熊猫数据框,可以根据某些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
答案 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_3
和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