数据帧在子函数中被覆盖
dataframe is overwritten in subfunction
以下示例显示了在子函数中编辑数据框时出现的问题,但仅返回了其中的一部分
以下是代码作用的简要说明:
do_something()
创建 col3
并覆盖 col1
和 col2
do_something()
returns 仅 col3
df.merge(df_new, how='left')
将 col3
添加到 df
col1
和df
的col2
在子函数中改变,在主函数中不应该改变
我不明白这一点,因为函数内的变量变化不应该影响函数外的值。
非常感谢您就如何避免这种行为提出意见。
import pandas as pd
def do_something(df):
df['col3'] = df['col1']+df['col2'] # new column
df['col1'] = 111 #some change
df['col2'] = 222 #some change
return df[['col3']].copy()
data = {"col1":[1, 2, 3], "col2":[4, 5, 6]}
df = pd.DataFrame(data)
df_new = do_something(df)
df.merge(df_new, how='left')
print('orginal df was modified by do_something')
print(df)
print('the return of the function do_something')
print(df_new)
这里是网上找的例子https://trinket.io/python3/3f273591fb
df的当前输出
col1 col2 col3
0 111 222 5
1 111 222 7
2 111 222 9
df 的预期输出
col1 col2 col3
0 1 4 5
1 2 5 7
2 3 6 9
回答
如 this is not a pandas issue, it's because of mutability
的评论中所述
您正在将原始对象的引用传递给函数,以便对原始对象进行编辑。
您必须将副本传递给您的函数。
使用:
df_new = do_something(df.copy())
以下示例显示了在子函数中编辑数据框时出现的问题,但仅返回了其中的一部分
以下是代码作用的简要说明:
do_something()
创建col3
并覆盖col1
和col2
do_something()
returns 仅col3
df.merge(df_new, how='left')
将col3
添加到df
col1
和df
的col2
在子函数中改变,在主函数中不应该改变
我不明白这一点,因为函数内的变量变化不应该影响函数外的值。
非常感谢您就如何避免这种行为提出意见。
import pandas as pd
def do_something(df):
df['col3'] = df['col1']+df['col2'] # new column
df['col1'] = 111 #some change
df['col2'] = 222 #some change
return df[['col3']].copy()
data = {"col1":[1, 2, 3], "col2":[4, 5, 6]}
df = pd.DataFrame(data)
df_new = do_something(df)
df.merge(df_new, how='left')
print('orginal df was modified by do_something')
print(df)
print('the return of the function do_something')
print(df_new)
这里是网上找的例子https://trinket.io/python3/3f273591fb
df的当前输出
col1 col2 col3
0 111 222 5
1 111 222 7
2 111 222 9
df 的预期输出
col1 col2 col3
0 1 4 5
1 2 5 7
2 3 6 9
回答
如
您正在将原始对象的引用传递给函数,以便对原始对象进行编辑。 您必须将副本传递给您的函数。
使用:
df_new = do_something(df.copy())