2013-05-17 4 views
6

Имея ряд так:панды: как выбрать путем частичного ярлыке индекса

ds = Series({'wikipedia':10,'wikimedia':22,'wikitravel':33,'google':40}) 

google  40 
wikimedia  22 
wikipedia  10 
wikitravel 33 
dtype: int64 

Я хотел бы, чтобы выбрать строки, где «вики» является частью метки индекса (частичная строка меток) ,

На данный момент я попытался

ds[ds.index.map(lambda x: 'wiki' in x)] 

wikimedia  22 
wikipedia  10 
wikitravel 33 
Name: site, dtype: int64 

и это делает работу, но как-то индекс плачет «содержит», как и то, что столбцы имеют ...

Любой лучший способ сделать это ?

ответ

10

Несколько дерзкий способ может быть использование loc:

In [11]: ds.loc['wiki': 'wikj'] 
Out[11]: 
wikimedia  22 
wikipedia  10 
wikitravel 33 
dtype: int64 

Это, по существу эквивалентно ds[ds.index.map(lambda s: s.startswith('wiki'))].

Для содержит, как предполагает @DSM, это, вероятно, лучше, чтобы написать как:

ds[['wiki' in s for s in ds.index]] 
+0

Хех, хороший трюк, это правда, но он работает только с начала. Не 'содержит'. Или я ошибаюсь? – ronszon

+0

Нет, вы совершенно правы ... –

+1

Существует 'ds.irow (Series (ds.index) .str.contains (" wiki "))', но я думаю, что предпочитаю простой 'ds [['wiki' in x для x в ds.index]] '. Кстати, я думаю, что здесь есть некоторые ошибки: 'list (ds.str)', похоже, продолжается вечно. – DSM

1

Другое решение с использованием filter см here:

>>> ds.filter(like='wiki', axis=0) 
wikimedia  22 
wikipedia  10 
wikitravel 33 
dtype: int64 
Смежные вопросы