Подтвердить что ты не робот

Получение индекса строки в функции приложения 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.

4b9b3361

Ответ 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