получение индекса строки в функции pandas apply


Я пытаюсь получить доступ к индексу строки в функции, применяемые во всем DataFrame в панд. У меня есть что-то вроде этого:

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.

Я знаю, что могу создать временный столбец в таблице, где я храню индекс, но мне интересно, есть ли он где-то в объекте строки.

2 52

2 ответа:

получить доступ к индексу в этом случае вы получаете доступ к :

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

EDIT

глядя на этот вопрос 3+ лет спустя, вы могли бы просто сделать:

In[15]:
df['d'],df['rowIndex'] = df['a'] + df['b'] * df['c'], df.index
df

Out[15]: 
   a  b  c   d  rowIndex
0  1  2  3   7         0
1  4  5  6  34         1

но предполагая, что это не так тривиально, как это, независимо от вашего rowFunc действительно делает, вы должны смотреть, чтобы использовать векторизованные функции, а затем используйте их против индекса df:

In[16]:
df['newCol'] = df['a'] + df['b'] + df['c'] + df.index
df

Out[16]: 
   a  b  c   d  rowIndex  newCol
0  1  2  3   7         0       6
1  4  5  6  34         1      16

apply() это не тот дроид, которого вы ищете.

таблицы данных.iterrows () позволяет перебирать строки и получать доступ к их имени:

for name, row in df.iterrows():
    ...