2016-11-14 10 views
0

フィルタリングされたデータフレームを、いくつかの列を操作するための関数に再度渡しています。私はこれがすでに何度も上がっていることを知っていますが、ドキュメントやその他の関連する質問を読んだ後でさえ、私はまだ頭がおかしくなりません。私は、私が実験を始めることができる実際の例がほしいと思う。パンダ:フィルタリングされたデータフレーム列を変更する

ここに失敗した試行があります。 s1は、実際のユースケースから列操作関数に渡される値になります。

>>> import pandas as pd 
>>> 
>>> df1 = pd.DataFrame({'a': [1, 2, 3, 4], 'b': [ 8, 7, 6, 5]}) 
>>> df1 
    a b 
0 1 8 
1 2 7 
2 3 6 
3 4 5 
>>> 
>>> s1 = df1.loc[df1['a']<=2, :] 
>>> s1 
    a b 
0 1 8 
1 2 7 
>>> s1['b'] = 0 
__main__: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 
>>> df1 
    a b 
0 1 8 
1 2 7 
2 3 6 
3 4 5 
>>> s1.loc[:, 'b'] = 0 
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/indexing.py:508: 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_labels[indexer[info_axis]]] = value 
>>> df1 
    a b 
0 1 8 
1 2 7 
2 3 6 
3 4 5 
>>> s2 = df1[df1['a']<=2] # next try: # this seems to create a detached copy of df1 
>>> s2 
    a b 
0 1 8 
1 2 7 
>>> s2.loc[:,'b']=0 
>>> df1 # df1 didn't change :-(
    a b 
0 1 8 
1 2 7 
2 3 6 
3 4 5 
>>> s2 # ... only filtered copy of df1 did. 
    a b 
0 1 0 
1 2 0 
+0

達成しようとしているのは正確です。 – James

+0

私は、データフレームのいくつかの列を変更する関数 'f(df)'を使用しています。可能であれば、フィルタリングされたデータフレームを透過的に渡したいので、行のサブセットのみが変更されます(実際にはこの機能はいくつかの追加フィルタリングを行い、サブセットのサブセットを変更しました。 – orange

+0

これは実際には不可能だと私は実際考えています。 'ix'や' loc'などを使って1行で行うのでなければ、データフレームのサブセットを作成し、そのデータを変更し、元のデータフレームを変更することはできません。誰でもこれを確認できますか? – orange

答えて

0

私はあなたがたとえば、関数.IX

を使うべきだと思う:

df1.ix[df1['a']<=2, 'b'] = 0 

はあなたが達成したいということですか?

+0

これは機能しません。私の使用事例に相当するのは、 's3 = df1.ix [df1 ['a'] <= 2、:] '' 's3 [' b '] = 4'です。 "df1"を変更しないフィルタに関するもの)。 – orange

+0

あなたがしたいことは、a <= 2の場合、bに0を設定することです。 – angelwally

関連する問題