我刚刚开始探索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))
我认为这样操作是正确的,但是这是否是推荐的/正确的方式来对复制的DataFrame进行缩放?它与’DataFrame.copy’函数有什么不同?
回答:
pd.DataFrame(data = data_source)
并不会创建副本。这在构造函数的copy
参数的文档中有说明:
copy : boolean, default False
从输入中复制数据。仅影响DataFrame / 2d ndarray输入
这也可以通过尝试更改结果来轻松观察到:
>>> x = pandas.DataFrame({'x': [1, 2, 3], 'y': [1., 2., 3.]})>>> y = pandas.DataFrame(x)>>> x x y0 1 1.01 2 2.02 3 3.0>>> y x y0 1 1.01 2 2.02 3 3.0>>> y.iloc[0, 0] = 2>>> x x y0 2 1.01 2 2.02 3 3.0
如果你想要一个副本,可以调用copy
方法。不过,你并不需要副本。apply
已经返回了一个新的DataFrame,而且更好的是,你可以直接对DataFrame调用numpy.log
或numpy.log1p
:
>>> x = pandas.DataFrame({'x': [1, 2, 3], 'y': [1., 2., 3.]})>>> numpy.log1p(x) x y0 0.693147 0.6931471 1.098612 1.0986122 1.386294 1.386294