2016-04-01 3 views
1

Скажем, у меня есть таблица, ss_prices, которая имеет столбец первичного ключа под названием fund_code что pandas лечит как индекс:Предложение Pandas WHERE для индекса строки?

>>> arr = list(zip(['MM1', 'MM2', '3MM', '4AA'], range(1,5))) 
>>> cols = ['fund_code', 'values'] 
>>> ss_prices = pd.DataFrame(arr, columns=cols).set_index('fund_code') 
>>> ss_prices 
       values 
    fund_code 
    MM1  1 
    MM2  2 
    3MM  3 
    4AA  4 

Я хочу, чтобы получить только те строки, в которых первичный ключ начинается с «ММ». В SQL я могу сделать:

select * from ss_prices 
where left(fund_code, 2) = 'MM' 

Но в pandas, кажется, что я должен сделать:

ss_prices[np.vectorize(lambda x: x[:2] == 'MM')(ss_prices.index.values)] 

Синтаксис pandas, конечно, более запутанным и менее читаемым. За исключением использования инструмента, такого как pandasql, есть ли более читаемый способ выполнения предложения WHERE?

ответ

2

Вы можете использовать DataFrame.filter для фильтрации по индексу, используя регулярное выражение:

In [5]: ss_prices 
Out[5]: 
    values 
MM1  1 
MM2  2 
3MM  3 
4AA  4 

In [6]: ss_prices.filter(regex='^MM', axis=0) 
Out[6]: 
    values 
MM1  1 
MM2  2 
+0

Красивые !! Я хочу, чтобы SQL мог делать регулярные выражения, подобные этому. –

1

Вы можете использовать x.startswith("MM") (и вы должны видеть PEP 8).

+0

Нравится? 'ss_prices [np.vectorize (lambda x: x.startswith ('MM')) (ss_prices.index.values)]'? Я немного согласен, но не очень. Я надеялся на что-то вроде 'ss_prices.where (lambda x: x.startswith ('MM'), axis = 0)' –

+0

@MichaelCurrie Да, это лучшее, что я могу сказать. – cdonts

1

Попробуйте df.index.to_series().str[:2]:

In [324]: df 
Out[324]: 
    a 
MMa 1 
MMb 2 
AAA 3 
BBB 4 

In [325]: df[df.index.to_series().str[:2] == 'MM'] 
Out[325]: 
    a 
MMa 1 
MMb 2 
1

Просто используйте str.startswith непосредственно на индексе, чтобы вернуть булеву маску:

In [27]: 
df[df.index.str.startswith('MM')] 

Out[27]: 
    a 
MMa 1 
MMb 2 
Смежные вопросы