我有两个数据帧,我希望根据另一个更新一列。问题是当我更新列时,旧的数据帧也会被重写。
(一个数据框包含列和目标变量之间的相关性,另一个应该显示排名)
import numpy as np
import pandas as pd
from scipy.stats import pearsonr
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:100]
y = iris.target[:100]
clmns = iris.feature_names
out = pd.DataFrame(index=np.arange(0,len(clmns)), columns=['coef'])
feat_coef = pd.DataFrame(columns=['Feature_name','pearson_koef_FM'])
feat_coef['Feature_name'] = clmns
feat_rank = feat_coef
X_np = np.array(X)
y_np = np.array(y)
for idx,name in enumerate(clmns):
out['coef'].loc[idx] = pearsonr(X_np[:,idx], y_np)[0]
feat_coef['pearson_koef_FM'] = np.absolute(out['coef'])
print '----BEFORE----'
print feat_coef
feat_rank['pearson_koef_FM'] = feat_coef['pearson_koef_FM'].rank(ascending=False)
print '----AFTER----'
print feat_coef
返回此内容:
----BEFORE----
Feature_name pearson_koef_FM
0 sepal length (cm) 0.72829
1 sepal width (cm) 0.684019
2 petal length (cm) 0.969955
3 petal width (cm) 0.960158
----AFTER----
Feature_name pearson_koef_FM
0 sepal length (cm) 3.0
1 sepal width (cm) 4.0
2 petal length (cm) 1.0
3 petal width (cm) 2.0
显然,我希望feat_coef
保持不变。如果我打印feat_rank
,我会得到正确的输出。我觉得它与复制数据帧时设置副本与视图有关。
答案 0 :(得分:1)
这一行之后:
feat_rank = feat_coef
feat_rank
是对feat_coef
的引用:
In [9]: feat_rank is feat_coef
Out[9]: True
In [10]: id(feat_rank)
Out[10]: 177476664
In [11]: id(feat_coef)
Out[11]: 177476664
In [12]: id(feat_coef) == id(feat_rank)
Out[12]: True
In [13]: feat_rank['new'] = 100
In [14]: feat_coef
Out[14]:
Feature_name pearson_koef_FM new
0 sepal length (cm) 0.72829 100
1 sepal width (cm) 0.684019 100
2 petal length (cm) 0.969955 100
3 petal width (cm) 0.960158 100
因此,如果您更改参考DF feat_rank
中的任何现有列(值) - 它将在源DF feat_coef
上完成
解决方案:如果您需要使用独立的DF .copy()
:
feat_rank = feat_coef.copy()