제로베이스 데이터 취업 스쿨 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"]]가 나와버린다.