2015-12-03 3 views
1

Начиная с этого простого dataframe df:панд - маска dataframe по имени столбца

col1,col2 
1,3 
2,1 
3,8 

Я хотел бы применить логический mask в зависимости от имени столбца. Я знаю, что это легко для значений:

mask = df <= 1 

df = df[mask] 

, которая возвращает:

маска:

col1 col2 
0 True False 
1 False True 
2 False False 

ДФ:

col1 col2 
0  1 NaN 
1 NaN  1 
2 NaN NaN 

, как и ожидалось. Теперь я хотел бы получить булеву маску на основе имени столбца, что-то вроде:

mask = df == df['col_1'] 

, который должен возвращать:

маски

col1 col2 
0 True False 
1 True False 
2 True False 

EDIT:

Это кажется странным , но мне нужны такие маски для более поздней фильтрации по колоннам с морскими тепловыми картами.

+2

Извините, но зачем показывать cols, которые не отвечают критериям? Вы можете фильтровать, выполнив 'df.filter (['col1'])' или 'df [df.columns [df.columns == 'col1]] ' – EdChum

+0

@EdChum спасибо! Фактически значения «True» относятся к значениям, соответствующим имени столбца, которое я хотел бы выбрать. –

+1

Ну, вы можете просто сделать 'df.columns == 'col1'', который вернет булевую маску – EdChum

ответ

6

Как отмечалось в комментариях, ситуации, когда вам нужно получить «маску», похоже, редки (и, скорее всего, вы не в одном из них). Следовательно, в Pandas, вероятно, нет хорошего «встроенного» решения для них.

Тем не менее, вы можете добиться того, что вам нужно, используя хак вроде следующего, например:

mask = (df == df) & (df.columns == 'col_1') 

Update:. Как отмечено в комментариях, если ваш фрейм данных содержит нули, маска, вычисленная таким образом, всегда будет False в соответствующих местах. Если это проблема, тем безопаснее вариант:

mask = ((df == df) | df.isnull()) & (df.columns == 'col_1') 
+0

Спасибо, но он возвращает неправильную маску, заполненную только «False» –

+0

Очевидно, вам нужно подставить правильное имя столбца. Я не знаю, должно ли это быть 'col1' или' col_1' или что-то еще. –

+1

Ах да, извините, моя вина !! он работает спасибо! –

1

Вы можете перенести свой dataframe чем сравнить его с колоннами, а затем перенести обратно. Немного странно, но работающий пример:

import pandas as pd 
from io import StringIO 

data = """ 
col1,col2 
1,3 
2,1 
3,8 
""" 

df = pd.read_csv(StringIO(data)) 
mask = (df.T == df['col1']).T 

In [176]: df 
Out[176]: 
    col1 col2 
0  1  3 
1  2  1 
2  3  8 


In [178]: mask 
Out[178]: 
    col1 col2 
0 True False 
1 True False 
2 True False 

EDIT

я нашел еще один ответ на этот вопрос, вы можете использовать isin метод:

In [41]: df.isin(df.col1) 
Out[41]: 
    col1 col2 
0 True False 
1 True False 
2 True False 

EDIT2

Как @ DSM показывают в комментарии, что эти два случая работают неправильно. Поэтому вы должны использовать @KT. метод. Но .. Давайте играть больше с транспонированием:

df.col2 = df.col1 

In [149]: df 
Out[149]: 
    col1 col2 
0  1  1 
1  2  2 
2  3  3 

In [147]: df.isin(df.T[df.columns == 'col1'].T) 
Out[147]: 
    col1 col2 
0 True False 
1 True False 
2 True False 
+1

'df.isin (df.col1)' работает здесь только по совпадению - попробуйте его с помощью 'df [" col2 "] = [3,2,8]', например. На самом деле, подумайте об этом, ваш метод транспонирования работает только по совпадению. : -/Попробуйте его с помощью 'df [" col2 "] = df [" col1 "]'. – DSM

+0

@DSM Да, ты прав ... Спасибо, я постараюсь найти другой путь –

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