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

How to create a copy of an existing DataFrame(panda)?

我刚刚开始探索 pandas。我尝试在不影响源 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))

我认为它工作正常,但它是 recommended/correct 在复制的 DataFrame 上应用缩放的方法吗?它与 'DataFrame.copy' 函数有何不同?

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)

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

copy : boolean, default False
Copy data from inputs. Only affects DataFrame / 2d ndarray input

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

>>> 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 已经 returns 一个新的数据帧,更好的是,您可以直接在数据帧上调用 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