programing

팬더 적용 함수에서 행의 색인을 얻는 것

prostudy 2022. 9. 13. 21:42
반응형

팬더 적용 함수에서 행의 색인을 얻는 것

전체에 적용되는 함수의 행 인덱스에 액세스하려고 합니다.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.

인덱스를 저장하는 테이블에 임시 열을 만들 수 있지만, 행 객체에 저장되어 있는지 궁금합니다.

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

둘 중 하나: #1. withrow.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():
    ...

첫 번째 질문에 답하려면: 예, 에서 행의 인덱스 값에 액세스할 수 있습니다.apply(). 키 아래에 있습니다.name를 지정할 필요가 있습니다.axis=1람다는 열의 열이 아닌 행의 열을 처리하기 때문입니다.

동작 예(팬더 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

언급URL : https://stackoverflow.com/questions/26658240/getting-the-index-of-a-row-in-a-pandas-apply-function

반응형