【问题标题】:Not deleting rows as part of function - python不删除行作为函数的一部分 - python
【发布时间】:2017-09-04 19:11:25
【问题描述】:

请记住,我来自 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)

在调用我的函数之前,我得到了完整的预期结果(首先删除第一行,然后是所需的列命名)。

关于为什么它不能作为函数的一部分工作,但它在函数之外起作用的任何想法?

非常感谢任何帮助。

提前致谢。

【问题讨论】:

  • 您不会 return 函数中的 DF 并将其分配给某些东西。更改应用于函数范围,然后被丢弃。在您的第一个函数中将return x 放在x.columns 下并执行df = dfFormatF(df) 以调用该函数并将结果分配给df
  • x = x.iloc[4:] 不应该改变df吗?另外,这个x.columns = ['Name1', 'Name2', 'Name3'] 也不应该得到处理吗?为什么返回但不是第一部分?我也试过用return x 结束我的函数,但这也没有用。
  • 已发布,您正在编辑,所以没有看到您的新笔记。你的建议奏效了:)我不得不说df = dfFormatF(df),一切都很好。非常感谢您的帮助-如果您将其作为答案发布,我可以关闭它。
  • 感谢您的接受。请也查看我的编辑,这很重要。
  • 我明白了——我不知道这一点。感谢您非常详尽的解释!

标签: python user-defined-functions


【解决方案1】:

这里的问题是,更改只在dfFormatF() 的范围内。一旦退出该函数,所有更改都将丢失,因为您没有return 结果并且您没有将结果分配给模块级范围内的某些内容。有必要退后一步从一般意义上理解这一点(这不是 Pandas 特有的东西)。

相反,将您的 DF 传递给函数,对该 DF 进行您想要的转换,return 结果,然后将该结果分配回您传递给函数的名称。

注意这在 Pandas 中是一件大事。我们在这里模拟的是inplace=True 功能。 很多你可以对 DataFrames 做很多事情,如果你不使用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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多