2015-05-17 1 views
3

Представьте меня pandas.Dataframe как:Как выбрать из каждого столбца один конкретный индекс?

x = DataFrame({ 'a': [7,6,8,0,2,5], 
      'b': [3,4,5,6,7,8], 
      'c': [3,8,5,6,0,1]}, index=[1,2,3,4,5,6]) 

тогда, у меня есть pandas.Series, что дает мне, для каждого ключа, определенный индекс Я хочу, чтобы выбрать:

y = Series([4,1,6], index=['a','b','c']) 

ли там где-то я мог найти эти индексы лучшим способом панд? Я хочу, чтобы не перебирать pandas.Series или pandas.Dataframe, и я предпочитаю использовать команды типа .loc, .query и т. Д.

ответ

3

Вы можете использовать комбинацию loc и np.diagonal для достижения этой цели:

In [26]: 

np.diagonal(x.loc[y]) 
Out[26]: 
array([0, 3, 1], dtype=int64) 

loc здесь будет выполнять поиск метки строки:

In [27]: 

x.loc[y] 
Out[27]: 
    a b c 
4 0 6 6 
1 7 3 3 
6 5 8 1 

np.diagonal возвращает значения в диагонали.

Чтобы сделать это устойчивым к порядку столбцов мы можем определенно использовать значения для поиска этикетки и индекс для столбцов, чтобы выбрать:

In [30]: 

np.diagonal(x.loc[y.values, y.index]) 
Out[30]: 
array([0, 3, 1], dtype=int64) 

выше будет работать с, даже если столбцы в y являются другой порядок, чем x порядок столбцов.

+0

В этом случае я знал о поведении .loc, поэтому я хотел что-то, что могло бы частично решить это. Действительно, numpy.diagonal - хорошая идея. Я хочу, чтобы у панд было что-то подобное. –

+0

@ Galdaran похоже, что они делали это в ['0.14.0'] (http://pandas.pydata.org/pandas-docs/version/0.14.1/generated/pandas.Index.diagonal.html), но это больше не в последних версиях, возможно, из-за рефакторинга в ndframe и ndarray, а не в numpy array – EdChum

+0

Однако применение numpy.diagonal не возвращает другой pandas.Series, а массив. –

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