Я пытаюсь передать фильтрованный фреймворк в функцию, предназначенную для манипулирования некоторыми столбцами (опять же с использованием фильтрации). Я знаю, что это было так много раз уже на SO, но даже после прочтения документов и других связанных вопросов у меня все еще проблемы с головой. Мне кажется, мне нужен рабочий пример, из которого я могу начать экспериментировать.Pandas: изменение отфильтрованных столбцов файловой системы данных
Вот мои неудачные попытки. 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' и т. Д. Может ли кто-нибудь подтвердить это? – orange