Pandas apply 활용 중 당황한 부분

I'm Cape·2023년 5월 19일
0

제로베이스 데이터 취업 스쿨 3주차 스터디노트 4호

from random import randint
import pandas as pd
import numpy as np

fake_data = np.random.randn(200, 26)
columns = [chr(x) for x in range(97, 123)]
indices = pd.date_range("20230519", periods=200)

d_frame = pd.DataFrame(fake_data, indices, columns)
d_frame.head()

아래의 출력 결과는?!

d_frame["a"] == d_frame["a"].apply(np.sum)
2023-05-19    True
2023-05-20    True
2023-05-21    True
2023-05-22    True
2023-05-23    True
              ... 
2023-11-30    True
2023-12-01    True
2023-12-02    True
2023-12-03    True
2023-12-04    True
Freq: D, Name: a, Length: 200, dtype: bool

pandas Series 인스턴스에 대하여 apply를 활용하면 np.sum이나 np.mean은 적용되지 않는다.

재미있게도 반대로는 정상 작동한다.

np.sum(d_frame["a"])
-7.945091540967392

넘파이를 사용하지 않아도 정상 작동한다.

d_frame["a"].apply("sum") # python의 sum 함수 사용
-7.945091540967392

그럼 apply를 활용해서 하나의 열에 대한 합은 볼 수 없는 것인가?
이는 pandas Series 인스턴스가 아닌,
pandas DataFrame 인스턴스를 활용하면 된다.
(정석적인 방법인지는 잘 모르겠다.)

d_frame[["a"]].apply(np.sum)
a   -7.945092
dtype: float64

참고로 d_frame[["a"]]는 pandas DataFrame 인스턴스고, d_frame["a"]는 pandas Series 인스턴스이다.

print("First:", type(d_frame["a"]))
print("Second:", type(d_frame[["a"]]))
First: <class 'pandas.core.series.Series'>
Second: <class 'pandas.core.frame.DataFrame'>

마지막으로 장난을 쳐보자면,

d_frame["a"].apply(np.sum) == d_frame[["a"]].apply(np.sum, axis=1)
2023-05-19    True
2023-05-20    True
2023-05-21    True
2023-05-22    True
2023-05-23    True
              ... 
2023-11-30    True
2023-12-01    True
2023-12-02    True
2023-12-03    True
2023-12-04    True
Freq: D, Length: 200, dtype: bool

axis의 개념이 조금 헷갈리는 것 같은데,
axis=0이 기본값이며, 행끼리 뭔가 액션을 하는 것이다.
axis=1은 열끼리 뭔가 액션을 취하는 것이다.

따라서 위에서 axis=1인 상태로 apply를 취해버리면,
열이 1개밖에 없는데 열끼리 더하는 것이므로
그냥 d_frame[["a"]]가 나와버린다.

profile
Impact

0개의 댓글