2016-04-06 9 views
2

データフレームの列の最初と最後の行を設定します。 1つの列の最後の行要素とそれ以外の値を指定します。は、私はこの上で読んでいると、まだ少し混乱件名見つける

A value is trying to be set on a copy of a slice from a DataFrame.と、これは潜在的に危険であることを伝えます

df.iloc[[0, -1]].mycol = [1, 2]

:私はこれを行うことができます。

代わりに.locを使用できますが、最初と最後の行のインデックスを知る必要があります(偶然にも、.ilocは私が場所によってアクセスできるようにします)。

これを行う最も安全な方法は何ですか?このポイントを取得するには

# Django queryset 
query = market.stats_set.annotate(distance=F("end_date") - query_date) 

# Generate a dataframe from this queryset, and order by distance 
df = pd.DataFrame.from_records(query.values("distance", *fields), coerce_float=True) 
df = df.sort_values("distance").reset_index(drop=True) 

その後、私はdf.distance.iloc[[0, -1]] = [1, 2]を呼び出してみてください。これは警告を発する。

+1

は 'df ['mycol']ですiloc [[0、-1]] = [1,2]'仕事ですか? – EdChum

+0

行または列を最初に索引付けするかどうかにかかわらず、同じ警告。 – Quentin

+0

答えが正しく表示されるので、警告につながるすべての手順を正確に表示する必要があります。 – EdChum

答えて

2

問題はilocではなく、.mycolにアクセスするとコピーが作成されます。あなたはすべてのiloc以内にこれを行うことができます。

df.iloc[[0, -1], df.columns.get_loc('mycol')] = [1, 2] 

通常ixあなたは混合整数とラベル・ベースのアクセスをしたい場合に使用されますが、-1がインデックスに実際にはないので、この場合には動作しない、と明らかにixそれが最後のインデックスでなければならないことを知るのに十分スマートではありません。

+0

ああ!コピーが作成されます。ありがとう! – Quentin

1

あなたがやっていることは、連鎖インデックスと呼ばれ、あなたは警告を回避するために、その列にだけilocを使用することができます。

In [24]: 
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc')) 

Out[24]: 
      a   b   c 
0 1.589940 0.735713 -1.158907 
1 0.485653 0.044611 0.070907 
2 1.123221 -0.862393 -0.807051 
3 0.338653 -0.734169 -0.070471 
4 0.344794 1.095861 -1.300339 

In [25]: 
df['a'].iloc[[0,-1]] ='foo' 
df 

Out[25]: 
      a   b   c 
0  foo 0.735713 -1.158907 
1 0.485653 0.044611 0.070907 
2 1.12322 -0.862393 -0.807051 
3 0.338653 -0.734169 -0.070471 
4  foo 1.095861 -1.300339 

あなたがそれを行う場合は他の方法は、それは警告を発生させます:

In [27]: 
df.iloc[[0,-1]]['a'] ='foo' 

C:\WinPython-64bit-3.4.3.1\python-3.4.3.amd64\lib\site-packages\IPython\kernel\__main__.py:1: 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 
    if __name__ == '__main__': 
+0

実際、 'df.mycol.iloc [[0、-1]]'はまだ私のために警告を発しています。私は0.17.1です。 'pd.DataFrame.from_records'を使って作成されたものなのかなと思います。 – Quentin

+0

私は0.18.0で同じ問題を抱えていました。上のコードを実行したときに警告は出ませんでしたが、作成したテストデータで同じメソッドを使用したときに警告が表示されました。奇妙な。 – root

+0

時々、Pythonがポインタの概念をより明示的にしたいと望むことがあります; – Quentin

関連する問題