퀀트

04. DataFrame : 생성, 연산, 정렬, 병합, 그룹, 쿼리

만 기 2022. 11. 30. 20:12

DataFrame 연산 메소드

prac_df = 주가_데이터.T.loc['2020-09-10':'2020-09-12', ['A005930','A005940']]

print(prac_df.abs())        # 절댓값
print(prac_df.isna())       # NaN 여부
print(prac_df.notna())      # 유효 여부
print(prac_df.pow(2))        # 거듭제곱
  • .isna() 와 .notna()의 결과 값은 True or False
  • .isna() 값이 True다 = np.NaN = None = pd.NaT
    • ‘ ‘ 처럼 공백은 False다.
  • .pow()의 첫번째 인자로 상수가 들어가면 broadcast로 거듭제곱하고, Series나 DataFrame이 인자로 들어갈 수 있다.
  • .pow()에 axis값(default=columns)을 인자로 넣을 수 있다.

 

DataFrame Aggregation

print(prac_df.mean())           # 평균
print(prac_df.sum())            # 합
print(prac_df.prod())           # 곱
print(prac_df.min(axis=1))      # 최솟값
print(prac_df.max())            # 최댓값
print(prac_df.median())         # 중간값
print(prac_df.idxmax())         # 최대원소의 인덱스
print(prac_df.idxmin())         # 최소원소의 인덱스

print(prac_df.cumsum())         # 누적덧셈
print(prac_df.cumprod())        # 누적곱셈
print(prac_df.cummin())         # 누적최솟값
print(prac_df.cummax())         # 누적최댓값
  • 인자 없으면 axis=0 (수직)
  • .idxmax() 와 .idxmin()은 인덱스 라벨 이름을 반환한다.
  • .median

 

DataFrame 정렬

.sort_values(정렬기준, axis=축, ascending=True)

sort_df = prac_df.sort_values('2020-09-11',axis='columns', ascending=True)
print(sort_df)
Symbol      A005940  A005930
2020-09-10   9280.0  59200.0
2020-09-11   9270.0  59000.0

sort_df = prac_df.sort_values('A005930',axis='index', ascending=True)
print(sort_df)
Symbol      A005930  A005940
2020-09-11  59000.0   9270.0
2020-09-10  59200.0   9280.0
  • 정렬기준(행,열)에 따라 axis 방향 정해준다.
  • ascending 기본값은 True이고, 내림차순은 False로 한다.

 

.rank(axis=축, ascending=True)

rank_df = prac_df.rank(axis=0, ascending=False)
print(rank_df)
Symbol      A005930  A005940
2020-09-10      1.0      1.0
2020-09-11      2.0      2.0

 

DataFrame 만들기

pd.DataFrame()

pd.DataFrame([[0,1,2],[3,4,5]],
             index=['00','11'],
             columns=['a','b','c'])
    a	b	c
00	0	1	2
11	3	4	5

# numpy 배열로 dataframe 생성하기
pd.DataFrame(np.ones((3,5)))
    0 	1 	2 	3 	4
0	1.0	1.0	1.0	1.0	1.0
1	1.0	1.0	1.0	1.0	1.0
2	1.0	1.0	1.0	1.0	1.0

 

열 추가

trafic_data.loc[:, '잡플래닛'] = np.nan             # 행 데이터 NaN으로 생성
trafic_data.loc[:, '잡코리아'] = [980, 1020]        # 행 데이터 지정
trafic_data.loc[:, '스펙업'] = 20000                # 값 하나면 broadcast 된다.

			원티드	사람인	잡플래닛	잡코리아	스펙업
10/22	 9800	 5500	    NaN	    980	20000
10/23	10200	 6600   	NaN	   1020	20000

 

행 추가

trafic_data.loc['10/24'] = [12500, 4520, 3000, 780, 21000]      # 행 데이터 추가
trafic_data.loc['10/25'] = 2000       # broadcast 추가

			원티드	사람인	잡플래닛	잡코리아	스펙업
10/22	 9800	 5500	    NaN	    980	20000
10/23	10200	 6600	    NaN	   1020	20000
10/24	12500	 4520	 3000.0	    780	21000
10/25	 2000	 2000	 2000.0	   2000	 2000
  • 잡플래닛에 소숫점이 붙는 이유 ⇒ np.nan 으로 생성되면 type이 float임!!!

 

수정

trafic_data.loc['10/22', '잡플래닛'] = 99

		 원티드	사람인	잡플래닛	잡코리아	스펙업
10/22	9800	 5500	   99.0	    980	20000

 

csv 파일로 저장 또는 불러오기

# dataframe을 csv파일로 저장
prac_df.to_csv('prac_df.csv')

# 한글이 포함된 경우
trafic_data.to_csv('trafic_data.csv', encoding='cp949')

# csv파일 불러오기
prac_df_2 = pd.read_csv('prac_df.csv')

# 한글 포함된 파일 불러오기
trafic_data_2 = pd.read_csv('trafic_data.csv', encoding='cp949', index_col=0)

 

rename()

**df_b = df_b.rename(columns={
    '2020-10-13':'주가_10_13',
    '2020-10-14':'주가_10_14'})**
  • .rename(columns={기존이름 : 바꿀이름})

 

concat() 으로 병합하기

df_a = pd.DataFrame([['동화약품', '제약_및_바이오'],['우리은행',np.nan],['KR모터스','자동차_및_부품']],
                    index=['A000020','A000030','A000040'],
                    columns=['itemname','Sector'])

df_b = pd.DataFrame([[24300.0, 23850.0],[14800.0, 14800.0],[850, 874]],
                    index=['A000020','A000030','A000040'],
                    columns=['2020-10-13','2020-10-14'])

df_b = df_b.rename(columns={
    '2020-10-13':'주가_10_13',
    '2020-10-14':'주가_10_14'})

**print(pd.concat([df_a, df_b]))**
						itemname        Sector  주가_10_13  주가_10_14
A000020     동화약품  제약_및_바이오       NaN       NaN
A000030     우리은행            NaN       NaN       NaN
A000040     KR모터스  자동차_및_부품       NaN       NaN
A000020         NaN            NaN   24300.0   23850.0
A000030         NaN            NaN   14800.0   14800.0
A000040         NaN            NaN     850.0     874.0

**print(pd.concat([df_a, df_b], axis=1))**
					 itemname         Sector  주가_10_13  주가_10_14
A000020     동화약품  제약_및_바이오   24300.0   23850.0
A000030     우리은행            NaN   14800.0   14800.0
A000040     KR모터스  자동차_및_부품     850.0     874.0
  • pd.concat()
  • axis 설정하여 병합 방향 정해줘야함. default = axis=0
  • 행, 열에 공통된 데이터 없으면 NaN으로 채운다.

 

groupby(집계대상, axis) 묶어서 Aggregation 하기

특정 인덱스나 컬럼의 값 별로 그룹핑하여 aggregation한다.

집계 대상에 행 또는 열의 값을 넣는다.

axis는 생략가능

concat_df.groupby('Sector').sum()
concat_df.groupby('Sector').mean()
concat_df.groupby('Sector').count()
concat_df.groupby('Sector').max()

 

query() 로 dataframe 필터링하기

column을 대상으로 원하는 데이터를 찾을 수 있다.

컬럼은 큰 따옴표 없이 작성하고, 값의 숫자도 그대로 작성이지만 값의 문자열은 큰 따옴표로 묶는다.

쿼리문은 and, or 등으로 중첩 가능하다.