2016-11-14 3 views
0

Я пытаюсь передать фильтрованный фреймворк в функцию, предназначенную для манипулирования некоторыми столбцами (опять же с использованием фильтрации). Я знаю, что это было так много раз уже на 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 
+0

Что именно вы пытаетесь достичь? – James

+0

Я использую функцию 'f (df)', которая модифицирует некоторые столбцы данных. Я хотел бы, если это возможно, передать фильтрованный файл данных, если это возможно, поэтому модифицируется только подмножество строк (на самом деле эта функция выполняет некоторую дополнительную фильтрацию и только модифицирует подмножество подмножества - не уверен, что это актуально). – orange

+0

Я действительно думаю, что это невозможно. Вы не можете создать подмножество фрейма данных, изменить его данные и ожидать, что исходный формат данных будет изменен, если вы не сделаете все это в одной строке, используя 'ix',' loc' и т. Д. Может ли кто-нибудь подтвердить это? – orange

ответ

0

Я думаю, вы должны использовать функцию .ix

Например:

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

, что вы хотите достичь?

+0

Нет, это тоже не работает. Эквивалентом для моего варианта использования будет 's3 = df1.ix [df1 ['a'] <= 2,:]', а затем 's3 ['b'] = 4' (в функции, которая не знает «ничего о фильтре», который не меняет 'df1'. – orange

+0

Что вы хотите сделать, так это иметь 0 для b, где <= 2, правильно? – angelwally

Смежные вопросы