2016-12-13 4 views
0

これらのコードでは、In [15]: df4['t']=2df3には適用されませんでした。これは私が望むものではありません。私はそれに気づい、列アクションがあまりにもdf3にapplyedこと加えるのではなく、単にdf4に適用される。(ただしdf4['t']=2がTという名前の列を追加しますが、私を混同行を追加しませんでした)パンダ:スーパーセットのサブセットからスーパーセットに列を追加するにはどうすればよいですか?

を加えて欲しいですヒントA value is trying to be set on a copy of a slice from a DataFrame

この問題を解決するにはどんな考えですか?

In [6]: df2 =pandas. DataFrame(np.random.randn(10, 5)) 

In [7]: df2 
Out[7]: 
      0   1   2   3   4 
0 0.222512 -0.907183 0.516238 -1.307885 1.604694 
1 -0.648315 0.024165 0.487837 -0.374203 -0.193131 
2 0.961563 1.847492 -1.773695 -0.791906 -0.458998 
3 0.550847 2.221003 0.197836 -1.260352 0.794854 
4 -0.211655 0.555512 0.832657 -0.703831 -0.586403 
5 -0.384389 1.622995 -0.858065 -0.455278 -1.354076 
6 -0.331782 1.256876 -1.080412 1.425681 0.017413 
7 -1.008093 0.914414 2.023874 -0.004319 0.733349 
8 -0.038734 -0.771304 -0.644371 -0.492886 2.111187 
9 -2.812306 -1.434702 -0.074720 1.413066 -0.160265 

In [8]: df3=df2 

In [9]: df3 
Out[9]: 
      0   1   2   3   4 
0 0.222512 -0.907183 0.516238 -1.307885 1.604694 
1 -0.648315 0.024165 0.487837 -0.374203 -0.193131 
2 0.961563 1.847492 -1.773695 -0.791906 -0.458998 
3 0.550847 2.221003 0.197836 -1.260352 0.794854 
4 -0.211655 0.555512 0.832657 -0.703831 -0.586403 
5 -0.384389 1.622995 -0.858065 -0.455278 -1.354076 
6 -0.331782 1.256876 -1.080412 1.425681 0.017413 
7 -1.008093 0.914414 2.023874 -0.004319 0.733349 
8 -0.038734 -0.771304 -0.644371 -0.492886 2.111187 
9 -2.812306 -1.434702 -0.074720 1.413066 -0.160265 

In [10]: df3['d']=1 

In [11]: df3 
Out[11]: 
      0   1   2   3   4 d 
0 0.222512 -0.907183 0.516238 -1.307885 1.604694 1 
1 -0.648315 0.024165 0.487837 -0.374203 -0.193131 1 
2 0.961563 1.847492 -1.773695 -0.791906 -0.458998 1 
3 0.550847 2.221003 0.197836 -1.260352 0.794854 1 
4 -0.211655 0.555512 0.832657 -0.703831 -0.586403 1 
5 -0.384389 1.622995 -0.858065 -0.455278 -1.354076 1 
6 -0.331782 1.256876 -1.080412 1.425681 0.017413 1 
7 -1.008093 0.914414 2.023874 -0.004319 0.733349 1 
8 -0.038734 -0.771304 -0.644371 -0.492886 2.111187 1 
9 -2.812306 -1.434702 -0.074720 1.413066 -0.160265 1 

In [12]: df2 
Out[12]: 
      0   1   2   3   4 d 
0 0.222512 -0.907183 0.516238 -1.307885 1.604694 1 
1 -0.648315 0.024165 0.487837 -0.374203 -0.193131 1 
2 0.961563 1.847492 -1.773695 -0.791906 -0.458998 1 
3 0.550847 2.221003 0.197836 -1.260352 0.794854 1 
4 -0.211655 0.555512 0.832657 -0.703831 -0.586403 1 
5 -0.384389 1.622995 -0.858065 -0.455278 -1.354076 1 
6 -0.331782 1.256876 -1.080412 1.425681 0.017413 1 
7 -1.008093 0.914414 2.023874 -0.004319 0.733349 1 
8 -0.038734 -0.771304 -0.644371 -0.492886 2.111187 1 
9 -2.812306 -1.434702 -0.074720 1.413066 -0.160265 1 

In [13]: df4=df3.loc[:,'d'] 

In [14]: df4 
Out[14]: 
0 1 
1 1 
2 1 
3 1 
4 1 
5 1 
6 1 
7 1 
8 1 
9 1 
Name: d, dtype: int64 

In [15]: df4['t']=2 
C:\Users\jiahao\AppData\Local\Programs\Python\Python35\Scripts\ipython:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 

In [16]: df4 
Out[16]: 
0 1 
1 1 
2 1 
3 1 
4 1 
5 1 
6 1 
7 1 
8 1 
9 1 
t 2 
Name: d, dtype: int64 

In [17]: df3 
Out[17]: 
      0   1   2   3   4 d 
0 0.222512 -0.907183 0.516238 -1.307885 1.604694 1 
1 -0.648315 0.024165 0.487837 -0.374203 -0.193131 1 
2 0.961563 1.847492 -1.773695 -0.791906 -0.458998 1 
3 0.550847 2.221003 0.197836 -1.260352 0.794854 1 
4 -0.211655 0.555512 0.832657 -0.703831 -0.586403 1 
5 -0.384389 1.622995 -0.858065 -0.455278 -1.354076 1 
6 -0.331782 1.256876 -1.080412 1.425681 0.017413 1 
7 -1.008093 0.914414 2.023874 -0.004319 0.733349 1 
8 -0.038734 -0.771304 -0.644371 -0.492886 2.111187 1 
9 -2.812306 -1.434702 -0.074720 1.413066 -0.160265 1 

In [18]: 

答えて

2

ここにはいくつかの誤解があります。ステートメントdf4=df3.loc[:,'d']シリーズで、DataFrameではありません。だからdf4は今シリーズです。シリーズには列がありません。インデックスによって参照される値を持ちます。ブラケット演算子は、Seriesのインデックスを検索しようとします。あなたの次の文df4['t'] = 2 DF4は、このような.ilocに送信された列名のリスト使用してデータフレームを滞在することが可能です。2.

をシリーズにインデックスtを追加し、値を割り当てます。df4=df3.loc[:,['d']]を。 df4はDataFrameになり、コマンドdf4['t'] = 2を実行するとdf4に列が追加されるようになりました。

ステートメントdf4=df3.loc[:,'d']が列dの新しいコピーを作成しない可能性があり、したがってdf4が引き続きそれを参照する可能性があるという警告が表示されます。ただし、df4=df3.loc[:,['d']]は完全に独立したDataFrameであるように見え、警告を作成することはなく、追加のコード行を使用してd3を修正することもありません。

+0

したがって、データフレームの一部に「ポインタ」を作る方法はありません。データフレームの一部を変更する必要がある場合は、原点を直接変更する必要があります。 – guo

+0

これは非常に奇妙なことですし、コピーして警告を出して動作しない設定を生成します。 –

関連する問題