팬더 적용 함수에서 행의 인덱스 가져 오기


121

DataFramePandas 전체 에 적용된 함수의 행 인덱스에 액세스하려고합니다 . 다음과 같은 것이 있습니다.

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.

인덱스를 저장하는 테이블에 임시 열을 만들 수 있다는 것을 알고 있지만 어딘가에 행 개체에 저장되어 있는지 궁금합니다.


1
곁에 : 사용해야하는 이유가 apply있습니까? 프레임 자체에서 벡터화 된 작업을 수행하는 것보다 훨씬 느립니다. (때로는 적용하는 것이 가장 간단한 방법이며 성능 고려 사항은 종종 과장되지만 특정 예에서는 사용 하지 않는 것이 쉽습니다 .)
DSM

1
실제로 @DSM 다른 행 요소를 사용하여 각 행에 대해 다른 개체 생성자를 호출하고 있습니다. 나는 질문을 설명하기 위해 최소한의 예를 모으고 싶었습니다.
Mike

답변:


148

이 경우 색인에 액세스하려면 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

편집하다

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

의 경우 name명명 된 튜플 이면 좋을 것이므로 Multindex특정 인덱스 수준을 해당 이름으로 쿼리 할 수 ​​있습니다.
Konstantin

18

어느 한 쪽:

1. row.name내부 apply(..., axis=1)통화 :

df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'], index=['x','y'])

   a  b  c
x  1  2  3
y  4  5  6

df.apply(lambda row: row.name, axis=1)

x    x
y    y

2. iterrows()(느림)

DataFrame.iterrows ()를 사용하면 행을 반복하고 해당 색인에 액세스 할 수 있습니다.

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

2
그리고 우려된다면 'itertuples'는 일반적으로 훨씬 더 나은 성능을 발휘합니다. stackoverflow.com/questions/24870953/…
dpb

6

원래 질문에 답하려면 예,에서 행의 인덱스 값에 액세스 할 수 있습니다 apply(). 키 아래에서 사용할 수 있으며 name지정해야합니다 axis=1(람다는 열의 행이 아닌 행의 열을 처리하기 때문).

작동 예 (pandas 0.23.4) :

>>> import pandas as pd
>>> df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df.set_index('a', inplace=True)
>>> df
   b  c
a      
1  2  3
4  5  6
>>> df['index_x10'] = df.apply(lambda row: 10*row.name, axis=1)
>>> df
   b  c  index_x10
a                 
1  2  3         10
4  5  6         40

1
MultiIndex가있는 데이터 프레임에서도 작동합니다. row.name은 튜플이됩니다.
Charles Fox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.