【问题标题】:How to store a new dataframe after using a self defined function on it?使用自定义函数后如何存储新的数据框?
【发布时间】:2018-12-14 22:06:48
【问题描述】:

我刚刚开始使用用户定义的函数,所以这可能不是一个很复杂的问题,请见谅。

我有几个数据框,它们都有一个名为“interval_time”的列(例如),我想将此列重命名为“时间戳”。

我知道我可以用这个手动完成;

df = df.rename(index=str, columns={'interval_time': 'Timestamp'})

但现在我想定义一个名为 rename 的函数来为我做这件事。我已经看到这是可行的;

def rename(data):
    print(data.rename(index=str, columns={'interval_time': 'Timestamp'}))

但我似乎无法保存重命名的数据框,我已经尝试过了;

def rename(data):
    data = data.rename(index=str, columns={'interval_time': 'Timestamp'})

我使用的数据框具有以下形式;

df_scada
              interval_time                 A         ...             X                 Y 
0       2010-11-01 00:00:00                0.0        ...                396.36710         381.68860
1       2010-11-01 00:05:00                0.0        ...                392.97974         381.40634
2       2010-11-01 00:10:00                0.0        ...                390.15695         379.99493
3       2010-11-01 00:15:00                0.0        ...                389.02786         379.14810

【问题讨论】:

  • 如果我需要为 MCVE 添加任何其他内容,请告诉我
  • return data.rename(...)rename 函数中然后是 df = rename(df) 呢?
  • 漂亮,谢谢

标签: python pandas dataframe user-defined-functions


【解决方案1】:

有几点需要注意:

  • 您需要在函数中使用return
  • 将此类函数设为通用是一种很好的做法。例如,您的输入和输出列名可以是设置了默认值的参数。
  • Pandas 提供pd.DataFrame.pipe 以促进方法链接。
  • 不应将函数命名为与 Pandas 方法相同的名称。这只会导致混乱。

将这些元素放在一起:

def rename_col(data, col_in='interval_time', col_out='Timestamp'):
    return data.rename(index=str, columns={col_in: col_out})

df = df.pipe(rename_col)

这是一个简单的示例,它可能不需要 用户定义的函数。但是,当您编写更复杂的函数时,上述建议可能会有所帮助。

【讨论】:

  • 我同意这很简单,我可以用另一种方式更简单地完成它,我刚刚开始了解如何使用用户定义的函数,所以认为这是一个很好的尝试
  • @LukaVlaskalic,没问题,我想是的,这就是为什么我想我会提供一些额外的指针:)
  • 我刚刚更新了更复杂的问题
  • 我已经回滚了。请以new question 询问。由于已经有 3 个答案,因此每个人都无法根据新要求更新他们的答案。
  • 如果你真的想改进 pandas,请查看精彩的 Modern Pandas 博客系列。
【解决方案2】:

没有inplace=True,函数创建一个新对象,需要返回:

import pandas as pd

def rename(data):
    return data.rename(index=str, columns={'interval_time': 'Timestamp'})

data = pd.DataFrame([1,2,3,4], columns=['interval_time'])
renamed_data = rename(data)

如果不应该创建新的 DF,请在函数中设置 inplace=True。

【讨论】:

    【解决方案3】:

    调用rename 函数后不需要重新分配数据帧,因为pandas.DataFrame 是一个可变对象,因此它是通过引用传递的。看看这个链接如何传递 python 对象

    https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/

    此外,您应该使用inplace 属性,这样您就不会在函数内创建新对象。您在重命名函数中的代码将如下所示

    def rename(data):
        data.rename(index=str, columns={'interval_time': 'Timestamp'}, inplace=True)
    

    在您调用 rename(df) 之后,您的 DataFrame df 的列已重命名。

    【讨论】:

    • 实际上,使用 inplace 很常见 [不鼓励] (stackoverflow.com/questions/45570984/…)。顺便说一句,更好的解决方案就是不创建新函数而只使用data = data.rename(Index=str, columns={'interval_time': 'Timestamp'})。无论如何,这种方法和您的功能不适合管道
    猜你喜欢
    • 2021-11-06
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多