python - 在函数中调整 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
解决方案
一般来说,我认为在你的 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_3
and 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
推荐阅读
- javascript - 每行中的dataframe js计算
- java - 如何从一个二维数组中添加整数并创建一个新的二维数组
- python-3.x - 在python中动态命名函数
- spring-boot - 如何编写需要通过 Rest body 进行授权服务调用的 WebFlux 过滤器
- c - 如何重构具有不同结构指针作为参数的函数?
- c# - 为什么 asp.net core 的 URL Rewriting 中间件不匹配下面的正则表达式?
- google-sheets - 带有 INDEX MATCH 的数组公式返回匹配数组
- c++ - 如何创建 char C++ 类型的指针数组?
- c++ - 打印出数组值时获取垃圾值
- r - R Dataframe中列组合的唯一列值