【问题标题】:Pandas series remains the same after appending to it through a functionPandas 系列在通过函数附加后保持不变
【发布时间】:2021-05-29 20:27:18
【问题描述】:

编辑:
虽然我的问题的答案是 pandas 的行为不允许这种操作,但我仍然将 Henry Ecker 的答案标记为正确答案,因为这是最好的选择。

我目前在将 pandas 系列(和数据帧)传递给通过 pandas.Series.append() 进行追加的函数时遇到问题(问题与 pandas.concat() 相同)。
函数执行完成后,原来的系列似乎没有改变。

示例见下面的代码:

import pandas as pd


def main():
    series1 = pd.Series(range(5))
    series2 = pd.Series(range(5, 10))

    print(f'series1 before append_series():\n{series1}\n')
    append_series(series1, series2)
    print(f'series1 after append_series():\n{series1}')


def append_series(ser1, ser2):
    ser1 = ser1.append(ser2)


if __name__ == '__main__':
    main()

(请注意,PyCharm 确实强调了 ser1 的值没有被使用,因为它被认为是本地的)

运行代码的结果是:

series1 before append_series():
0    0
1    1
2    2
3    3
4    4
dtype: int64

series1 after append_series():
0    0
1    1
2    2
3    3
4    4
dtype: int64

我期望的地方:

series1 before append_series():
0    0
1    1
2    2
3    3
4    4
dtype: int64

series1 after append_series():
0    0
1    1
2    2
3    3
4    4
0    5
1    6
2    7
3    8
4    9
dtype: int64

运行该sn-p代码显示series1append_series()执行后没有改变。
我曾尝试在series1 上运行id() 而在main()ser1 上同时在append_series() 上运行append_series() 并且都返回相同的ID,我相信这意味着它们都引用了内存中的同一个对象。
虽然我可以在这里使用.append() 内的.append() 或将系列定义为全局变量而不必传递它们,但我在另一个更复杂的项目中遇到了问题,这就是为什么我想知道为什么会出现这种行为发生。

因此,我的问题是,为什么原来的series1 在函数执行后没有被修改?我做错了什么?

【问题讨论】:

  • 你的函数不返回任何东西,所以它不应该改变任何东西。您是否希望通过引用传递并使用副作用?所有计算机科学教义都表明这是一种糟糕的编程范式
  • 我希望能够在 append_series() 内部修改 series1 并能够在函数之外使用该修改。正如 Henry Ecker 所提到的,可以返回 series1.append(series2) 的结果,但我想知道是否可以不必这样做。
  • 这个问题的答案是否定的。 pandas 数据帧的所有组合类型操作都返回一个新实例。您必须将结果分配给一个新变量。此类修改没有 inplace 操作。
  • 感谢您的快速回复。然后,我将尝试看看如何在我的其他项目中解决这个问题。干杯!
  • 当您分析许多主要的系统中断和网络攻击时,不安全代码的核心是非托管共享内存和溢出。即汇编程序/ C malloc 模型。现代语言通过严格的范围界定来保护您免受这种情况的影响——打破这种模式几乎肯定会导致非常讨厌的错误,然后代码会导致许多网络安全问题。 out 是可能的,但不是一个好主意

标签: python pandas append series


【解决方案1】:

ser1 = ser1.append(ser2) 仅更改函数append_series 中的local 变量。

return 从函数中取而代之,并分配回main 中的series1 变量:

import pandas as pd


def main():
    series1 = pd.Series(range(5))
    series2 = pd.Series(range(5, 10))

    print(f'series1 before append_series():\n{series1}\n')
    series1 = append_series(series1, series2)
    print(f'series1 after append_series():\n{series1}')


def append_series(ser1, ser2):
    ser1 = ser1.append(ser2)
    return ser1


if __name__ == '__main__':
    main()

输出:

series1 before append_series():
0    0
1    1
2    2
3    3
4    4
dtype: int64

series1 after append_series():
0    0
1    1
2    2
3    3
4    4
0    5
1    6
2    7
3    8
4    9
dtype: int64

【讨论】:

    【解决方案2】:

    你只需要使用“返回”

    import pandas as pd
    
    
    def main():
        series1 = pd.Series(range(5))
        series2 = pd.Series(range(5, 10))
    
        print(f'series1 before append_series():\n{series1}\n')
        append_series(series1, series2)
        print(f'series1 after append_series():\n{series1}')
    
    
    def append_series(ser1, ser2):
        ser1 = ser1.append(ser2)
        return ser1
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      相关资源
      最近更新 更多