我刚刚开始探索熊猫。我尝试将对数缩放应用于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'有什么不同?功能
答案 0 :(得分:1)
DataFrame.apply
,.applymap
和np.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.log
或numpy.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