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()
编辑:
虽然我的问题的答案是 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()