Pandas 系列在通过函数追加后保持不变

Pandas series remains the same after appending to it through a function

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

我目前在将 pandas 系列(和数据帧)传递给通过 pandas.Series.append() (the problem is the same with 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

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

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

ser1 = ser1.append(ser2) 只改变函数 local 变量 append_series.

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

你只需要使用“return”

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()