2017-01-04 9 views
0

私は2つのデータフレームを持っていて、別のデータフレームに基づいて列を更新したいと考えています。問題は、私が列を更新すると、古いデータフレームも同様に書き直されるということです。明らかに新しいデータフレームのPandas設定列が古いデータフレームに置き換わる

----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は変わらない期待:

これを返す

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 

(一つのデータフレームは、他のランキングを表示するようになっている、列とターゲット変数の間の相関が含まれています) 。 feat_rankを印刷すると、正しい出力が得られます。私はそれがデータフレームをコピーするときにコピー対ビューを設定することと関係があるように感じる。この行の後

+1

'feat_rank'が、私はそれがこのようなものになります知っていた__reference__ですので、' feat_rank = feat_coef' '' – MaxU

+0

feat_rank = feat_coef.copy()と交換してください:あなたは.copy()を使用する独立したDFを必要としています。完璧に動作します!どうしてあなたはどうか説明できますか? – HonzaB

答えて

1

feat_rank = feat_coef 

feat_rankfeat_coefへの参照です:あなたが参照DF feat_rank内の既存の列(値)を変更するのであれば

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_coef

解決策: if

feat_rank = feat_coef.copy() 
関連する問題