Индексирование Pandas фреймов данных: целые строки, именованные столбцы

Скажите df - это фреймворк pandas.

  • df.loc[] принимает только имена
  • df.iloc[] принимает только целые числа (фактические места размещения)
  • df.ix[] принимает имена и целые числа:

При обращении к строкам df.ix[row_idx, ] требуется только имя. например

df = pd.DataFrame({'a' : ['one', 'two', 'three','four', 'five', 'six'],
                   '1' : np.arange(6)})
df = df.ix[2:6]
print(df)

   1      a
2  2  three
3  3   four
4  4   five
5  5    six

df.ix[0, 'a']

выдает ошибку, она не возвращает "два".

При ссылках на столбцы iloc предпочитает целые числа, а не имена. например.

df.ix[2, 1]

возвращает "три", а не 2. (Хотя df.idx[2, '1'] возвращает 2).

Как ни странно, мне бы хотелось получить совершенно противоположную функциональность. Обычно имена столбцов очень значимы, поэтому в моем коде я ссылаюсь на них напрямую. Но из-за большой очистки данных имена строк в моих кадре данных pandas обычно не соответствуют range(len(df)).

Я понимаю, что могу использовать:

df.iloc[0].loc['a'] # returns three

Но это кажется уродливым! Кто-нибудь знает, как лучше это сделать, чтобы код выглядел так?

df.foo[0, 'a'] # returns three

На самом деле, можно ли добавить мой собственный новый метод к pandas.core.frame.DataFrame s, так, например, df.idx(rows, cols) на самом деле df.iloc[rows].loc[cols]?

Ответ 1

Это поздний ответ, но комментарий @unutbu все еще действителен и является отличным решением этой проблемы.

Чтобы индексировать DataFrame с целыми строками и именованными столбцами (помеченные столбцы):

df.loc[df.index[#], 'NAME'] где # - действительный целочисленный индекс, а NAME - имя столбца.