如何创建现有DataFrame(熊猫)的副本?

时间:2018-01-16 21:45:28

标签: python pandas machine-learning clone

我刚刚开始探索熊猫。我尝试将对数缩放应用于Dataframe列而不影响源Dataframe。我将现有的DataFrame(data_source)传递给DataFrame构造函数,认为它会创建一个副本。

data_source = pd.read_csv("abc.csv")
log_data = pd.DataFrame(data = data_source).apply(lambda x: np.log(x + 1))

我认为它运行正常,但它是在复制的DataFrame上应用缩放的推荐/正确方法吗?它与' DataFrame.copy'有什么不同?功能

2 个答案:

答案 0 :(得分:1)

DataFrame.apply.applymapnp.log不会更改原始数据,因此无需copy()

同样,np.log接受数组,因此在这种特殊情况下,最好写一下:

log_data = pd.DataFrame(np.log(data_source.values + 1), 
                        columns=data_source.columns, 
                        index=data_source.index)

答案 1 :(得分:1)

pd.DataFrame(data = data_source)不会复制。这是构造函数的copy参数的文档中的documented

  

复制布尔值,默认为F
  从输入中复制数据。仅影响DataFrame / 2d ndarray输入

通过尝试改变结果也很容易观察到:

>>> x = pandas.DataFrame({'x': [1, 2, 3], 'y': [1., 2., 3.]})
>>> y = pandas.DataFrame(x)
>>> x
   x    y
0  1  1.0
1  2  2.0
2  3  3.0
>>> y
   x    y
0  1  1.0
1  2  2.0
2  3  3.0
>>> y.iloc[0, 0] = 2
>>> x
   x    y
0  2  1.0
1  2  2.0
2  3  3.0

如果您想要副本,请调用copy方法。但是,您不需要副本。 apply已经返回了一个新的数据框,更好的是,您可以直接在数据框上调用numpy.lognumpy.log1p

>>> x = pandas.DataFrame({'x': [1, 2, 3], 'y': [1., 2., 3.]})
>>> numpy.log1p(x)
          x         y
0  0.693147  0.693147
1  1.098612  1.098612
2  1.386294  1.386294