不删除行作为功能的一部分 - python
Not deleting rows as part of function - python
请记住我来自 R 背景(也是新手)。
我正在尝试创建一个 UDF 以根据一些定义的规则在 Python 中格式化 data.frame df
。第一部分删除 data.frame 的前 4 行,第二部分添加我想要的列名。我的函数如下所示:
def dfFormatF(x):
#Remove 4 first lines
x = x.iloc[4:]
#Assign column headers
x.columns = ['Name1', 'Name2', 'Name3']
dfFormatF(df)
当我 运行 它像这样时,它不起作用(既不删除第一行也不重命名)。当我删除 x=x.iloc[4:]
时,第二部分 x.columns = ['Name1', 'Name2', 'Name3']
工作正常并且列名称被重命名。另外,如果我运行函数外的去除,如:
def dfFormatF(x):
#Assign column headers
x.columns = ['Name1', 'Name2', 'Name3']
df=df.iloc[4:]
dfFormatF(df)
在我调用我的函数之前,我得到了完整的预期结果(首先删除第一行,然后删除所需的列命名)。
关于为什么它不能作为函数的一部分工作,但它在函数之外起作用的任何想法?
非常感谢任何帮助。
提前致谢。
这里的问题是变化只在dfFormatF()
范围内。一旦退出该函数,所有更改都将丢失,因为您没有 return
结果并且没有将结果分配给模块级范围内的某些内容。值得退一步从一般意义上理解这一点(这不是 Pandas 特定的事情)。
相反,将您的 DF 传递给函数,对那个 DF 进行您想要的转换,return
结果,然后将该结果分配回您传递给函数的名称。
注意这是Pandas中的一件大事。我们在这里模拟的是 inplace=True
功能。您可以对 DataFrame 执行 很多 的操作,如果您不使用 inplace=True
,那么这些更改将会丢失。如果您坚持使用默认值 inplace=False
,那么您必须将结果分配回一个变量(使用相同或不同的名称,由您决定)。
import pandas as pd
starting_df = pd.DataFrame(range(10), columns=['test'])
def dfFormatF(x):
#Remove 4 first lines
x = x.iloc[4:]
#Assign column headers
x.columns = ['Name1']
print('Inside the function')
print(x.head())
return x
dfFormatF(starting_df)
print('Outside the function')
print(starting_df) # Note, unchanged
# Take 2
starting_df = dfFormatF(starting_df)
print('Reassigning changes back')
print starting_df.head()
请记住我来自 R 背景(也是新手)。
我正在尝试创建一个 UDF 以根据一些定义的规则在 Python 中格式化 data.frame df
。第一部分删除 data.frame 的前 4 行,第二部分添加我想要的列名。我的函数如下所示:
def dfFormatF(x):
#Remove 4 first lines
x = x.iloc[4:]
#Assign column headers
x.columns = ['Name1', 'Name2', 'Name3']
dfFormatF(df)
当我 运行 它像这样时,它不起作用(既不删除第一行也不重命名)。当我删除 x=x.iloc[4:]
时,第二部分 x.columns = ['Name1', 'Name2', 'Name3']
工作正常并且列名称被重命名。另外,如果我运行函数外的去除,如:
def dfFormatF(x):
#Assign column headers
x.columns = ['Name1', 'Name2', 'Name3']
df=df.iloc[4:]
dfFormatF(df)
在我调用我的函数之前,我得到了完整的预期结果(首先删除第一行,然后删除所需的列命名)。
关于为什么它不能作为函数的一部分工作,但它在函数之外起作用的任何想法?
非常感谢任何帮助。
提前致谢。
这里的问题是变化只在dfFormatF()
范围内。一旦退出该函数,所有更改都将丢失,因为您没有 return
结果并且没有将结果分配给模块级范围内的某些内容。值得退一步从一般意义上理解这一点(这不是 Pandas 特定的事情)。
相反,将您的 DF 传递给函数,对那个 DF 进行您想要的转换,return
结果,然后将该结果分配回您传递给函数的名称。
注意这是Pandas中的一件大事。我们在这里模拟的是 inplace=True
功能。您可以对 DataFrame 执行 很多 的操作,如果您不使用 inplace=True
,那么这些更改将会丢失。如果您坚持使用默认值 inplace=False
,那么您必须将结果分配回一个变量(使用相同或不同的名称,由您决定)。
import pandas as pd
starting_df = pd.DataFrame(range(10), columns=['test'])
def dfFormatF(x):
#Remove 4 first lines
x = x.iloc[4:]
#Assign column headers
x.columns = ['Name1']
print('Inside the function')
print(x.head())
return x
dfFormatF(starting_df)
print('Outside the function')
print(starting_df) # Note, unchanged
# Take 2
starting_df = dfFormatF(starting_df)
print('Reassigning changes back')
print starting_df.head()