我正在修改函数中的数据框,但我不希望它更改全局变量。
我使用两种不同的方式来更改数据框,它们对全局变量的影响也不同。通过分配不存在的列来添加新列的第一种方法会修改全局数据框。通过串联新列,全局数据框保持不变。
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['a', 'b', 'c'])
def mutation(data):
data['d'] = [1, 2, 3]
mutation(df)
print(df)
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['a', 'b', 'c'])
def mutation(data):
data = pd.concat([data,pd.DataFrame([1,2,3], columns=['d'])], axis =1)
mutation(df)
print(df)
我希望在调用函数后打印df时,我看到a,b和c列。但是,第一种方法也会显示d列。
答案 0 :(得分:1)
将data
对象传递给函数时,实际上是将其引用传递给函数。因此,当您在指向的对象上进行就地突变时,您也可以在函数之外看到这些突变。
如果要保持原始数据不变,请按以下方式传递原始数据帧的克隆:
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['a', 'b', 'c'])
def mutation(data):
data['d'] = [1, 2, 3]
mutation(df.copy())
print(df)
输出:
a b c
0 1 2 3
1 4 5 6
2 7 8 9
该函数在克隆上运行,因此原始数据帧未修改。
您完成的第二个示例不是对原始数据帧的就地操作:而是创建一个新的数据帧。因此,在第二个示例中,您的原始DF未被修改。