python中本地和全局数据帧之间的链接如何

时间:2019-07-08 09:11:08

标签: python pandas function dataframe

我正在修改函数中的数据框,但我不希望它更改全局变量。

我使用两种不同的方式来更改数据框,它们对全局变量的影响也不同。通过分配不存在的列来添加新列的第一种方法会修改全局数据框。通过串联新列,全局数据框保持不变。

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列。

1 个答案:

答案 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未被修改。