Я пытаюсь получить доступ к индексу строки в функции, применяемой ко всему DataFrame
в Pandas. У меня примерно так:
df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df
a b c
0 1 2 3
1 4 5 6
и я определю функцию, которая обращается к элементам с заданной строкой
def rowFunc(row):
return row['a'] + row['b'] * row['c']
Я могу применить это так:
df['d'] = df.apply(rowFunc, axis=1)
>>> df
a b c d
0 1 2 3 7
1 4 5 6 34
Потрясающие! Что делать, если я хочу включить индекс в свою функцию? Индекс любой данной строки DataFrame
перед добавлением d
будет Index([u'a', u'b', u'c', u'd'], dtype='object')
, но мне нужны 0 и 1. Так что я не могу просто получить доступ row.index
.
Я знаю, что могу создать временный столбец в таблице, где я храню индекс, но мне интересно, хранится ли он где-нибудь в объекте строки.
apply
? Это намного медленнее, чем выполнение векторизованных операций с самим фреймом. (Иногда применить - это самый простой способ что-то сделать, и соображения производительности часто преувеличиваются, но в вашем конкретном примере так же легко не использовать его.)Ответы:
В этом случае для доступа к индексу вы обращаетесь к
name
атрибуту:Обратите внимание, что если это действительно то, что вы пытаетесь сделать, следующее работает и работает намного быстрее:
РЕДАКТИРОВАТЬ
Глядя на этот вопрос спустя 3+ года, вы могли бы просто сделать:
но если предположить, что это не так тривиально, чем бы вы ни
rowFunc
занимались на самом деле, вам следует использовать векторизованные функции, а затем использовать их против индекса df:источник
name
бы в случае a был бы именованный кортежMultindex
, чтобы можно было запрашивать определенный уровень индекса по его имени.Либо:
1. с
row.name
внутреннимapply(..., axis=1)
звонком:2. с
iterrows()
(медленнее)DataFrame.iterrows () позволяет перебирать строки и получать доступ к их индексу:
источник
Чтобы ответить на исходный вопрос: да, вы можете получить доступ к значению индекса строки в
apply()
. Он доступен под ключомname
и требует вашего указанияaxis=1
(поскольку лямбда обрабатывает столбцы строки, а не строки столбца).Рабочий пример (панды 0.23.4):
источник