Получение индекса строки в функции приложения pandas
Я пытаюсь получить доступ к индексу строки в функции, применяемой во всем 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
Awesome! Теперь, если я хочу включить индекс в свою функцию?
Индекс любой заданной строки в этом DataFrame
перед добавлением d
будет Index([u'a', u'b', u'c', u'd'], dtype='object')
, но я хочу 0 и 1. Поэтому я не могу просто получить доступ к row.index
.
Я знаю, что могу создать временный столбец в таблице, где я храню индекс, но мне интересно, если он где-то помечен в объекте row.
Ответы
Ответ 1
Для доступа к индексу в этом случае вы получаете доступ к атрибуту name
:
In [182]:
df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
def rowFunc(row):
return row['a'] + row['b'] * row['c']
def rowIndex(row):
return row.name
df['d'] = df.apply(rowFunc, axis=1)
df['rowIndex'] = df.apply(rowIndex, axis=1)
df
Out[182]:
a b c d rowIndex
0 1 2 3 7 0
1 4 5 6 34 1
Обратите внимание: если это действительно то, что вы пытаетесь сделать, следующее работает и выполняется намного быстрее:
In [198]:
df['d'] = df['a'] + df['b'] * df['c']
df
Out[198]:
a b c d
0 1 2 3 7
1 4 5 6 34
In [199]:
%timeit df['a'] + df['b'] * df['c']
%timeit df.apply(rowIndex, axis=1)
10000 loops, best of 3: 163 µs per loop
1000 loops, best of 3: 286 µs per loop