【发布时间】: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代码显示series1在append_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