programing

데이터 프레임 인덱스에 함수 적용

stoneblock 2023. 7. 28. 21:45

데이터 프레임 인덱스에 함수 적용

판다의 색인 위에 함수를 적용하는 가장 좋은 방법은 무엇입니까?DataFrame현재 저는 다음과 같은 장황한 접근법을 사용하고 있습니다.

pd.DataFrame({"Month": df.reset_index().Date.apply(foo)})

어디에Date인덱스의 이름입니다.foo적용하는 함수의 이름입니다.

이미 HYRY가 댓글로 제시한 것처럼 Series.map이 여기로 가는 길입니다.인덱스를 결과 시리즈로 설정하기만 하면 됩니다.

간단한 예:

df = pd.DataFrame({'d': [1, 2, 3]}, index=['FOO', 'BAR', 'BAZ'])
df
        d
FOO     1
BAR     2
BAZ     3

df.index = df.index.map(str.lower)
df
        d
foo     1
bar     2
baz     3

인덱스!= 시리즈

지적된 바와 같이 by @OP. th edf.index.map(str.lower)call은 numpy 배열을 반환합니다.이는 데이터 프레임 인덱스가 시리즈가 아닌 numpy 배열을 기반으로 하기 때문입니다.

인덱스를 시리즈로 만드는 유일한 방법은 인덱스에서 시리즈를 만드는 것입니다.

pd.Series(df.index.map(str.lower))

주의사항

Indexclass now 하위 클래스StringAccessorMixin즉, 위의 작업을 다음과 같이 수행할 수 있습니다.

df.index.str.lower()

이 경우에도 시리즈가 아닌 인덱스 개체가 생성됩니다.

다음을 사용하여 인덱스를 변환할 수 있습니다.to_series()방법, 그리고 어느 한쪽.apply또는map필요에 따라

ret = df.index.map(foo)                # Returns pd.Index
ret = df.index.to_series().map(foo)    # Returns pd.Series
ret = df.index.to_series().apply(foo)  # Returns pd.Series

위의 모든 것을 의 새 열 또는 기존 열에 직접 할당할 수 있습니다.df:

df["column"] = ret

완전성을 위해 모든 것이 요소별로 작동합니다.자주 사용합니다.map로 표시된 룩업을 적용합니다.dicts또는pd.Series.apply추가 기능과 함께 모든 함수를 전달할 수 있기 때문에 더 일반적입니다.args또는kwargs사이의 차이점apply그리고.map자세한 내용은 이 SO 스레드에서 설명합니다.왜인지 모르겠다.pd.Index.apply누락되었습니다.

함수 "foo"를 인덱스에 적용하여 현재 데이터 프레임에 열을 만들고 싶다고 가정합니다.당신은 쓸 수 있어요...

df['Month'] = df.index.map(foo)

영상 시리즈를 단독으로 생성하려면 대신 다음 작업을 수행할 수 있습니다.

pd.Series({x: foo(x) for x in foo.index})

많은 응답자가 인덱스를 배열로 반환하여 인덱스 이름 등에 대한 정보가 손실됩니다.pd.Series(index.map(myfunc), name=index.name)) MultiIndex에서도 작동하지 않습니다.

이 작업을 수행한 방법은 "이름 바꾸기"를 사용하는 것입니다.

mix = pd.MultiIndex.from_tuples([[1, 'hi'], [2, 'there'], [3, 'dude']], names=['num', 'name'])
data = np.random.randn(3)
df = pd.Series(data, index=mix)
print(df)
num  name 
1    hi       1.249914
2    there   -0.414358
3    dude     0.987852
dtype: float64

# Define a few dictionaries to denote the mapping
rename_dict = {i: i*100 for i in df.index.get_level_values('num')}
rename_dict.update({i: i+'_yeah!' for i in df.index.get_level_values('name')})
df = df.rename(index=rename_dict)
print(df)
num  name       
100  hi_yeah!       1.249914
200  there_yeah!   -0.414358
300  dude_yeah!     0.987852
dtype: float64

이것의 유일한 요령은 당신의 인덱스가 여러 개의 인덱스 레벨에 따라 고유한 레이블을 가져야 한다는 것입니다. 하지만 아마도 저보다 더 똑똑한 사람이 그것을 피하는 방법을 알고 있을 것입니다.제 목적을 위해 이것은 95%의 시간에 작동합니다.

언급URL : https://stackoverflow.com/questions/20025325/apply-function-on-dataframe-index