2017-05-14 6 views
2

私はこのようなセルを変更するコードを持っています:IBM["PNL"][2]=3。それは動作しますが、それは警告アップを示しています。私は、記事にIBM.loc[2,"PNL"]=3されていたでしょう値を変更する適切な方法を読むことができるものからデータフレーム内のセルを正しく変更するにはどうすればよいですか?

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 

を。しかし、それは私のために動作しませんし、それが次のエラーで失敗します。

Traceback (most recent call last): 

    File "<ipython-input-25-10debbad977d>", line 1, in <module> 
    IBM_dataframe.loc[0,"PNL"] 

    File "C:\Users\menkaur\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 1310, in __getitem__ 
    return self._getitem_tuple(key) 

    File "C:\Users\menkaur\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 796, in _getitem_tuple 
    return self._getitem_lowerdim(tup) 

    File "C:\Users\menkaur\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 922, in _getitem_lowerdim 
    section = self._getitem_axis(key, axis=i) 

    File "C:\Users\menkaur\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 1482, in _getitem_axis 
    self._has_valid_type(key, axis) 

    File "C:\Users\menkaur\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 1409, in _has_valid_type 
    key = self._convert_scalar_indexer(key, axis) 

    File "C:\Users\menkaur\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 196, in _convert_scalar_indexer 
    return ax._convert_scalar_indexer(key, kind=self.name) 

    File "C:\Users\menkaur\Anaconda2\lib\site-packages\pandas\tseries\base.py", line 591, in _convert_scalar_indexer 
    self._invalid_indexer('index', key) 

    File "C:\Users\menkaur\Anaconda2\lib\site-packages\pandas\indexes\base.py", line 1284, in _invalid_indexer 
    kind=type(key))) 

TypeError: cannot do index indexing on <class 'pandas.tseries.index.DatetimeIndex'> with these indexers [2] of <type 'int'> 

今、私は私が間違って何をやっている

混乱していますか?これは、ラベルベースのインデックスである

IBM.loc[IBM.index[2], "PNL"] = 3 

答えて

3

IBMpd.DataFrameであり、IBM["PNL"]pd.Seriesであると仮定する。 [](角括弧)は__getitem__メソッドを呼び出し、シリーズオブジェクトを返します。 IBM["PNL"][2]で返された系列、つまり[2]の部分には、__getitem__メソッドが呼び出されます。ちょっと混乱しても、これは今のところ問題ありません。この問題は、割り当てを試みたときに発生しました。 IBM["PNL"][2] = 3pandasIBM["PNL"]の2番目の要素を割り当てています。これはIBMデータフレーム内の"PNL"の列のビューです。

だから、答えは適切なインデクサを使用してlocilocatiat、またはset_valueIBMデータフレームに直接割り当てることです。


loc
あなたがインデクサとして1次元配列を渡すことができます。配列は、索引または列のスライス(サブセット)にすることも、索引または列と同じ長さのブール値配列にすることもできます。

スペシャルノート:スカラーインデクサーが渡されたときに、locは以前存在しなかった新しいインデックスまたは列の値を割り当てることができます。そのインデックス値ではなく位置を除いlocと同様

# described by @ayhan 
IBM.loc[IBM.index[2], 'PNL'] = 3 

iloc
。ただし、に新しい列またはインデックスを割り当てることはできません。スカラインデクサーのためlocと非常によく似ています

# described by @ayhan 
IBM.iloc[2, IBM.columns.get_loc('PNL')] = 3 

at
は配列インデクサーで操作できません。 Can!ilocと同じように動作し、新たな指標と列

IBM.at[IBM.index[2], 'PNL'] = 3 

iat
を割り当てます。 は配列インデクサーでは機能しません。 できません!新しいインデックスとカラムを割り当てます。スカラインデクサーのためlocと非常によく似ています

IBM.iat[2, IBM.columns.get_loc('PNL')] = 3 

set_value
は配列インデクサーで操作できません。 Can!ilocと同じように動作し、新たな指標と列

IBM.set_value(IBM.index[2], 'PNL', 3) 

set_value with takable=True
を割り当てます。 は配列インデクサーでは機能しません。 できません!新しいインデックスとカラムを割り当てます。

IBM.set_value(2, IBM.columns.get_loc('PNL'), 3, takable=True) 
+1

これはあまりにもこの質問で非常に良いでしょうhttp://stackoverflow.com/questions/28757389/loc-vs-iloc-vs-ix-vs-at-vs-iat – ayhan

+1

@ayhan行われ、THX再びそれを指摘するために。 – piRSquared

4

は今.ixが廃止されていることを、次の2つの選択肢があります。ラベルが必要ですが、その位置があるので、IBM.index[2]を使用してラベルを返します。または、

IBM.iloc[2, IBM.columns.get_loc('PNL')] = 3 

これは位置ベースのインデックス作成です。列PNLの位置を取得するには、get_locを使用します。

エラーは、行に位置ベースの索引付けを使用しようとしていたが、列にラベルベースの索引付けを使用していたためでした。 .ixはこのようなケースを処理するように設計されていますが、推奨されていません。 Hereは、@ jezraelに記載されているような詳細です。

関連する問題