フィルタリングされたデータフレームを、いくつかの列を操作するための関数に再度渡しています。私はこれがすでに何度も上がっていることを知っていますが、ドキュメントやその他の関連する質問を読んだ後でさえ、私はまだ頭がおかしくなりません。私は、私が実験を始めることができる実際の例がほしいと思う。パンダ:フィルタリングされたデータフレーム列を変更する
ここに失敗した試行があります。 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
達成しようとしているのは正確です。 – James
私は、データフレームのいくつかの列を変更する関数 'f(df)'を使用しています。可能であれば、フィルタリングされたデータフレームを透過的に渡したいので、行のサブセットのみが変更されます(実際にはこの機能はいくつかの追加フィルタリングを行い、サブセットのサブセットを変更しました。 – orange
これは実際には不可能だと私は実際考えています。 'ix'や' loc'などを使って1行で行うのでなければ、データフレームのサブセットを作成し、そのデータを変更し、元のデータフレームを変更することはできません。誰でもこれを確認できますか? – orange