web-dev-qa-db-ja.com

locを使用してデータフレームを更新するpython pandas

列構造のpandasデータフレーム(df)があります:

_month a b c d
_

このデータフレームには、たとえば1月、2月、3月、4月のデータがあります。A、B、C、Dは数値列です。 2月の場合、列Aを再計算し、データフレームで更新します。つまり、月= 2月、A = B + C + D

私が使用したコード:

_ df[df['month']=='Feb']['A']=df[df['month']=='Feb']['B'] + df[df['month']=='Feb']['C'] + df[df['month']=='Feb']['D'] 
_

これはエラーなしで実行されましたが、2月の列Aの値は変更されませんでした。コンソールで、次のメッセージが表示されました。

DataFrameからのスライスのコピーに値を設定しようとしています。
代わりに.loc [row_indexer、col_indexer] = valueを使用してみてください

.locを使おうとしましたが、現在作業中のデータフレームで.reset_index()を使用していたため、インデックスを設定して.locを使用する方法がわかりません。私はドキュメントに従いましたが、明確ではありません。ここで私を助けてくれませんか?これはサンプルデータフレームです:

_ import pandas as pd import numpy as np
 dates = pd.date_range('1/1/2000', periods=8)
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) 
_

ある日付を更新したい:2000-01-03。リアルタイムデータであるため、データのスニペットを提供できません。

7
Data Enthusiast

警告からわかるように、loc[row_index, col_index]を使用する必要があります。データをサブセット化すると、インデックス値が得られます。 row_indexを渡してから、カンマcol_nameを渡す必要があります。

df.loc[df['month'] == 'Feb', 'A'] = df.loc[df['month'] == 'Feb', 'B'] + df.loc[df['month'] == 'Feb', 'C'] + df.loc[df['month'] == 'Feb', 'D'] 
8

最も美しくはありませんが、(行を明示的に繰り返さずに)目標を達成する方法は次のとおりです。

df.ix[df['month'] == 'Feb', 'a'] = df[df['month'] == 'Feb']['b'] + df[df['month'] == 'Feb']['c']  

ix非推奨 Pandas v0.20.0 iloc/locを支持します。

1
DeepSpace