получение индекса строки в функции 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 ответа:
получить доступ к индексу в этом случае вы получаете доступ к :
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(): ...