不删除行作为功能的一部分 - 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()