본문 바로가기

Python/Data analysis

[Python] Data Analysis - DataFrame

데이터 프레임을 만드는 3가지 방법

1. 딕셔너리로 데이터 프레임 생성.

2. 리스트로 데이터 프레임 생성

3. 리스트와 딕셔너리로 데이터 프로임 생성

 

from pandas import DataFrame

data = {
    '종목코드': ["037730", "036360", "005670"],
    '종목명': ["3R", "3SOFT", "ACTS"],
    '현제가': [1510, 1790, 1185]
}

df = DataFrame(data)
df
-----------------------------------
	종목코드	종목명	현제가
0	037730	3R	1510
1	036360	3SOFT	1790
2	005670	ACTS	1185

 

from pandas import DataFrame

data = [
    ["037730", "3R", 1510],
    ["036360", "3SOFT", 1790],
    ["005670", "ACTS", 1185]
]    

columns = ["종목코드", "종목명", "현재가"]
df = DataFrame(data=data, columns=columns)
df
---------------------------------------------
	종목코드	종목명	현제가
0	037730	3R	1510
1	036360	3SOFT	1790
2	005670	ACTS	1185

 

from pandas import DataFrame

data = [
    {"종목코드":"037730", "종목명":"3R", "현재가":1510},
    {"종목코드":"036360", "종목명":"3SOFT", "현재가":1790},
    {"종목코드":"005670", "종목명":"ACTS", "현재가":1185}
]    

df = DataFrame(data=data)
df

------------------------------------------------
	종목코드	종목명	현제가
0	037730	3R	1510
1	036360	3SOFT	1790
2	005670	ACTS	1185

 

 

인덱스

데이터 프레임에 인덱스 지정을 안한 경우.

 

from pandas import DataFrame

data = [
    ["037730", "3R", 1510, 7.36],
    ["036360", "3SOFT", 1790, 1.65],
    ["005670", "ACTS", 1185, 1.28]
]

columns = ["종목코드", "종목명", "현재가", "등락률"]
df = DataFrame(data=data, columns=columns)
print(df)
---------------------------------------------
     종목코드    종목명   현재가   등락률
0  037730     3R  1510  7.36
1  036360  3SOFT  1790  1.65
2  005670   ACTS  1185  1.28

 

 

인덱스를 지정한 경우 - 인덱스 컬럼이 데이터에 포함된 경우

 

from pandas import DataFrame

data = [
    ["037730", "3R", 1510, 7.36],
    ["036360", "3SOFT", 1790, 1.65],
    ["005670", "ACTS", 1185, 1.28]
]

columns = ["종목코드", "종목명", "현재가", "등락률"]
df = DataFrame(data=data, columns=columns)
df = df.set_index("종목코드")
df
---------------------------------------------
	종목명	현재가	등락률
종목코드			
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005670	ACTS	1185	1.28

 

 

인덱스를 지정한 경우 - 인덱스 컬럼을 별도로 설정하는 경우

 

from pandas import DataFrame

data = [
    ["3R", 1510, 7.36],
    ["3SOFT", 1790, 1.65],
    ["ACTS", 1185, 1.28]
]

index = ["037730", "036360", "005760"]
columns = ["종목명", "현재가", "등락률"]
df = DataFrame(data=data, index=index, columns=columns)
df
-----------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28

 

 

인덱스 컬럼에 이름을 추가/변경하는 경우

 

df.index.name = 'code'
df
---------------------------------
	종목명	현재가	등락률
code			
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28


df.index.name = 'code1'
df
---------------------------------
	종목명	현재가	등락률
code1			
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28

 

 

row 인덱싱 - 시리즈 형식으로 출력, 데이터프레임 형식으로 출력

 

df.loc["037730"]
---------------------------------
종목명      3R
현재가    1510
등락률    7.36
Name: 037730, dtype: object


df.loc[["037730"]]
---------------------------------
	종목명	현재가	등락률
code1			
037730	3R	1510	7.36

 

df.loc[ ["037730", "036360"] ]
----------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65


df.iloc[[0, 1]]
----------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65

 

 

특정 값 가져오기 - 행번호와 인덱스를 사용하는 인덱싱 예시

 

# 행번호로 행 선택 후 인덱싱 
print(df.iloc[0].iloc[0])            # 시리즈 열번호
print(df.iloc[0].iloc[1])            # 시리즈 열번호
print(df.iloc[0].loc["현재가"])        # 시리즈 인덱스 
print(df.iloc[0]["현재가"])            # 시리즈 인덱스

# 인덱스로 행 선택 후 인덱싱 
print(df.loc["037730"].iloc[0])      # 시리즈 열번호
print(df.loc["037730"].iloc[1])      # 시리즈 열번호
print(df.loc["037730"].loc["현재가"])  # 시리즈 인덱스 
print(df.loc["037730"]["현재가"])      # 시리즈 인덱스
-----------------------------------------------------
3R
1510
1510
1510

3R
1510
1510
1510

 

 

주의 사항

인덱스 또는 행번호로 데이터 접근시 표시방법에 대해서 주의해야 한다.

loc[,]/iloc[,] 와 loc[[],[]]/iloc[[],[]] 차이를 명확히 인지해야 한다.

 

df
------------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28


# print(df.loc[["037730", "현재가"]]) # 오류가 발생하므로 바로 구분가능

# 중괄호가 몇개인지에 따라서 결과가 아주다르다
print(df.iloc[[0, 1]])
------------------------------------
          종목명   현재가   등락률
037730     3R  1510  7.36
036360  3SOFT  1790  1.65


print(df.iloc[0, 1])
print(df.loc["037730", "현재가"])
------------------------------------
1510
1510


df.loc[["037730", "036360"], ["종목명", "현재가"]]
------------------------------------
	종목명	현재가
037730	3R	1510
036360	3SOFT	1790

 

 

필터링

 

df
--------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28


df[df['현재가']>1400]
--------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65

 

 

추가

컬럼추가

 

df
------------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28


from pandas import Series 
s = Series(data=[1600, 1600, 1600], index=df.index)
df['목표가'] = s
df
------------------------------------
	종목명	현재가	등락률	목표가
037730	3R	1510	7.36	1600
036360	3SOFT	1790	1.65	1600
005760	ACTS	1185	1.28	1600

 

df["차이"] = df["목표가"] - df["현재가"]
df
------------------------------------------
	종목명	현재가	등락률	목표가	차이
037730	3R	1510	7.36	1600	90
036360	3SOFT	1790	1.65	1600	-190
005760	ACTS	1185	1.28	1600	415

 

 

로우 추가

 

df
------------------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28


from pandas import Series 
s = Series(data=["LG전자", 60000, 3.84], index=df.columns)
df.loc["066570"] = s
df
------------------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28
066570	LG전자	60000	3.84


df.loc["066571"] = ["LG전자1", 60000, 3.84]
df
------------------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28
066570	LG전자	60000	3.84
066571	LG전자1	60000	3.84

 

s = Series(data=["LG전자2", 60000, 3.84], index=df.columns, name="066572")
df.append(s)
-----------------------------------------------
	종목명	현재가	등락률
코드			
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28
066570	LG전자	60000	3.84
066571	LG전자1	60000	3.84
066572	LG전자2	60000	3.84

 

 

삭제

컬럼/로우 삭제

 

df
--------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28

# 컬럼 삭제
new_df = df.drop("현재가", axis=1)
new_df
--------------------------------
	종목명	등락률
037730	3R	7.36
036360	3SOFT	1.65
005760	ACTS	1.28

# 로우 삭제
new_df = df.drop("037730", axis=0)
new_df
--------------------------------
	종목명	현재가	등락률
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28

 

 

레이블 변경

df
---------------------------------------
	종목명	현재가	등락률
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28


df.columns = ['name', 'close', 'fluctuation']
df.index.name = 'code'
df
---------------------------------------
	name	close	fluctuation
code			
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28


df.rename(columns={'name': '종목명'}, inplace=True)
df
---------------------------------------
	종목명	close	fluctuation
code			
037730	3R	1510	7.36
036360	3SOFT	1790	1.65
005760	ACTS	1185	1.28

 

 

데이터 타입 변경

map 메서드를 사용한 반복 코딩은 applymap 메서드를 사용하여 한번에 처리 가능하다.

판다스의 DataFrame 에서 applymap 메서드 제공

 

df
---------------------------------
	03/02	03/03	03/04
0	1,000	1,100	1,510
1	1,410	1,420	1,790
2	850	900	1,185


df.dtypes
---------------------------------
03/02    object
03/03    object
03/04    object
dtype: object


def remove_comma(x):
    return int(x.replace(',', ''))
df = df.applymap(remove_comma)
df
---------------------------------
	03/02	03/03	03/04
0	1000	1100	1510
1	1410	1420	1790
2	850	900	1185


df.dtypes
---------------------------------
03/02    int64
03/03    int64
03/04    int64
dtype: object

 

 

문자열 다루기

str.replace 는 리턴 타입이 object 이다. 

df
---------------------------------
	cd	nm	close
0	A060310	3S	2,920
1	A095570	AJ네트웍스	6,250
2	A006840	AK홀딩스	29,700
3	A054620	APS홀딩스	19,400


df['cd'] = df['cd'].str[1:]
df
---------------------------------
	cd	nm	close
0	060310	3S	2,920
1	095570	AJ네트웍스	6,250
2	006840	AK홀딩스	29,700
3	054620	APS홀딩스	19,400

df['close'] = df['close'].str.replace(',', '')
df
---------------------------------
	cd	nm	close
0	060310	3S	2920
1	095570	AJ네트웍스	6250
2	006840	AK홀딩스	29700
3	054620	APS홀딩스	19400

 

df.dtypes
--------------------------
cd       object
nm       object
close    object
dtype: object

 

remove_comma 를 사용하면 리턴 타입이 int64 로 변경된것을 볼 수 있다.

 

df['close'] = df['close'].map(remove_comma)
df
------------------------------------
	cd	nm	close
0	060310	3S	2920
1	095570	AJ네트웍스	6250
2	006840	AK홀딩스	29700
3	054620	APS홀딩스	19400

df.dtypes
------------------------------------
cd       object
nm       object
close     int64
dtype: object