2017-12-12 4 views
1

私はDataFrameを持っています。統計条件付きテストを行うために、ブール値の列( 'mar')に基づいて2つに分割しました。以下のように、2つの表の間のカウントの比率を使用して、他の列の組み合わせごとに 'mar'列に真の値の割合を表す列を追加します。このパンダの警告はどこから来たのですか?

>>> df_nomar 
    alc cig mar cnt 
1 1 1 0 538 
3 1 0 0 456 
5 0 1 0 43 
7 0 0 0 279 

>>> df_mar 
    alc cig mar cnt 
0 1 1 1 911 
2 1 0 1 44 
4 0 1 1 3 
6 0 0 1 2 
>>> df_mar.loc[:, 'prop'] = np.array(df_mar['cnt'])/(np.array(df_mar['cnt']) + np.array(df_nomar['cnt'])) 
/usr/local/lib/python3.5/dist-packages/pandas/core/indexing.py:296: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    self.obj[key] = _infer_fill_value(value) 
/usr/local/lib/python3.5/dist-packages/pandas/core/indexing.py:476: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    self.obj[item] = s 

>>> df_mar 
    alc cig mar cnt  prop 
0 1 1 1 911 0.628709 
2 1 0 1 44 0.088000 
4 0 1 1 3 0.065217 
6 0 0 1 2 0.007117 

私は警告を調査するためにsuggested pageに行ってきました。新しい列を割り当てるときは、提案通りにdf_mar.loc[:, 'prop'] = ...の形式を使用しています。

なぜ私はまだこの警告を受けていますか?

+0

関連:[chained-assignment](https://stackoverflow.com/questions/tagged/chained-assignment?sort=votes&pageSize=30)タグ –

+1

https://www.dataquestを理解するためにこのブログを読んでください。 io/blog/settingwithcopywarning/ – Tanu

答えて

1

両方のDataFramereset_indexアライン・データのための同じサイズの場合に必要と思われる:

a = df_mar['cnt'].reset_index(drop=True) 
b = df_nomar['cnt'].reset_index(drop=True) 
df_mar['prop'] = (a/(a + b)).values 

別の解決策は、valuesによってnumpy arrayに変換される:

a = df_mar['cnt'].values 
b = df_nomar['cnt'].values 
df_mar['prop'] = a/(a + b) 

print (df_mar) 
    alc cig mar cnt  prop 
0 1 1 1 911 0.628709 
2 1 0 1 44 0.088000 
4 0 1 1 3 0.065217 
6 0 0 1 2 0.007117 

ない場合はこのパンダの警告は

です

これはobviosly上記のコードから来ています。フィルタDataFrame sが、その後copyが必要な場合:

df_nomar = df[df['mar'] == 0].copy() 
df_mar = df[df['mar'] == 1].copy() 

後でdf内の値を変更する場合は、変更が元のデータ(df_nomardf_mar)に伝播させて、パンダが警告ないことをしていないことがわかります。

+0

同じ方法ではなく、私のコードでnp.arrayに変換しました。 df [index] .valuesの方法で警告が引き続き発生します。 – kingledion

+1

私はあなたのコードと警告を試していないので、問題は上記のコード行にあると思います。 – jezrael

+0

多分[this](https://stackoverflow.com/q/20625582/2901002)や[moderna pandas](http://tomaugspurger.github.io/modern-1-intro.html)の[チュートリアル](http://pandas.pydata.org/pandas-docs/stable/tutorials.html#modern-pandas)(ヘッダー 'SettingWithCopy'を探してください) – jezrael

関連する問題