본문 바로가기
개발일지/Pandas

pandas 판다스 기초 14 import excel

by 다니엘의 개발 이야기 2022. 7. 27.
320x100
# Importing From Excel Files with pd.read_excel()
## First Steps - NEW (from Pandas Version 0.24x)

import pandas as pd
sales = pd.read_excel('sales.xls')
sales

'''

Unnamed: 0	City	Country	Sales	Bonus
0	Mike	New York	USA	25	2.50
1	Jim	Boston	USA	43	4.30
2	Steven	London	UK	76	7.60
3	Joe	Madrid	Spain	12	1.80
4	Tom	Paris	France	89	13.35
'''
# index_col을 통해서 엑셀을 열어봤을때 첫번째 컬럼을 열게된다. - index_col = 0
sales = pd.read_excel('sales.xls', index_col=0)
sales

'''
    City	Country	Sales	Bonus
Mike	New York	USA	25	2.50
Jim	Boston	USA	43	4.30
Steven	London	UK	76	7.60
Joe	Madrid	Spain	12	1.80
Tom	Paris	France	89	13.35
'''
sales.info()

'''
<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, Mike to Tom
Data columns (total 4 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   City     5 non-null      object 
 1   Country  5 non-null      object 
 2   Sales    5 non-null      int64  
 3   Bonus    5 non-null      float64
dtypes: float64(1), int64(1), object(2)
memory usage: 200.0+ bytes
'''
# header로 쓰기에 적합한 rows가 없다면 즉, header를 설정 안해줘도 되는 상태라면
# header = None으로 하고, 각 컬럼에 붙은 인덱스 넘버를 names 후처리로 변경하거나, 아예 header의 각 컬럼 인덱스 번호가 들어갈 자리에
# 들어갈 값을 지정해준다.

pd.read_excel('sales.xls', index_col = 0, header = None)

'''
	1	2	3	4
0				
NaN	City	Country	Sales	Bonus
Mike	New York	USA	25	2.5
Jim	Boston	USA	43	4.3
Steven	London	UK	76	7.6
Joe	Madrid	Spain	12	1.8
Tom	Paris	France	89	13.35
'''
pd.read_excel('sales.xls', index_col = 0, header = None, names = ['Name', 'Loc_City', 'Loc_Country', 'Revenue', 'Add_Comp'])

'''
    Loc_City	Loc_Country	Revenue	Add_Comp
Name				
NaN	City	Country	Sales	Bonus
Mike	New York	USA	25	2.5
Jim	Boston	USA	43	4.3
Steven	London	UK	76	7.6
Joe	Madrid	Spain	12	1.8
Tom	Paris	France	89	13.35
'''
# 엑셀 상의 시트에서 컬럼명이 A부터 E까지 있었다.
# 그 중에서 A부터 C까지의 컬럼을 긁어오는 것이다.
pd.read_excel('sales.xls', usecols= 'A:C')

'''

    Unnamed: 0	City	Country
0	Mike	New York	USA
1	Jim	Boston	USA
2	Steven	London	UK
3	Joe	Madrid	Spain
4	Tom	Paris	France
'''
# 부분적 컬럼을 이용하고 싶을경우 1 - 단일 컬럼

pd.read_excel('sales.xls', usecols='A')

'''

Unnamed: 0
0	Mike
1	Jim
2	Steven
3	Joe
4	Tom
'''
# 부분적 컬럼을 이용하고 싶을경우 2 - A부터 마지막까지 연속되게
# A부터 D까지의 컬럼

pd.read_excel('sales.xls', usecols= 'A:D')

'''
	Unnamed: 0	City	Country	Sales
0	Mike	New York	USA	25
1	Jim	Boston	USA	43
2	Steven	London	UK	76
3	Joe	Madrid	Spain	12
4	Tom	Paris	France	89
'''
# 부분적 컬럼을 이용하고 싶을경우 3 - A컬럼과 C부터 E컬럼까지 가져오고 싶을 때
# 이건 헷갈릴만 하다.

pd.read_excel('sales.xls', usecols='A, C:E')

'''

    Unnamed: 0	Country	Sales	Bonus
0	Mike	USA	25	2.50
1	Jim	USA	43	4.30
2	Steven	UK	76	7.60
3	Joe	Spain	12	1.80
4	Tom	France	89	13.35
'''
# 부분적 컬럼을 이용하고 싶을경우 4 - C컬럼부터 마지막 까지

pd.read_excel('sales.xls', usecols='C:')

# 아무것도 안뜨거나, 인덱스 에러 메세지가 뜬다.
# 부분적 컬럼을 이용하고 싶을경우 5 - 해당 컬럼 인덱스 넘버를 이용해서
# pd.read_excel('sales.xls', usecols=0)

# ValueError: Passing an integer for `usecols` is no longer supported.  Please pass in a list of int from 0 to `usecols` inclusive instead.
# 쉽게 말하자면 usecols의 값에 대해서는 리스트화 해서 입력해줘라. 라는 뜻이 뜬다.

pd.read_excel('sales.xls', usecols=[0])

'''

Unnamed: 0
0	Mike
1	Jim
2	Steven
3	Joe
4	Tom
'''
# 부분적 컬럼을 이용하고 싶을경우 6 - 숫자 컬럼으로 2번부터 끝까지

pd.read_excel('sales.xls', usecols=[2:])
# SyntaxError: invalid syntax
# 이것도 컬럼을 loc처럼 긁어오는 것이 에러가 나듯이 에러가 난다.
# 물론 에러문구는 틀리지만.
# 부분적 컬럼을 이용하고 싶을경우 7 - 숫자 컬럼으로 부분 부분

pd.read_excel('sales.xls',usecols=[0,2:4])

# SyntaxError: invalid syntax
# 이런 에러가 뜬다.
# 이런 iloc 기능의 컬럼 긁어오기 방식은 loc의 방식보다 더 한계가 있는것 같다.


## Customizing import with pd.read_excel()

import pandas as pd
pd.read_excel('summer_raw.xls')

'''
Unnamed: 0	City	Country	Sales	Bonus
0	Mike	New York	USA	25	2.5
1	Jim	Boston	USA	43	4.3
2	Steven	London	UK	76	7.6
3	Joe	Madrid	Spain	12	1.8
4	Tom	Paris	France	89	13.4
'''
# 드디어 엑셀 파일 중에서도 시트를 골라서 여는 기능을 배운다.
# 첫번째 시트 여는 방법 1

pd.read_excel('summer_raw.xls', sheet_name = 0)

'''

Unnamed: 0	City	Country	Sales	Bonus
0	Mike	New York	USA	25	2.5
1	Jim	Boston	USA	43	4.3
2	Steven	London	UK	76	7.6
3	Joe	Madrid	Spain	12	1.8
4	Tom	Paris	France	89	13.4
'''
# 첫번째 시트 여는 방법 2

pd.read_excel('summer_raw.xls', sheet_name='sales')

'''

Unnamed: 0	City	Country	Sales	Bonus
0	Mike	New York	USA	25	2.5
1	Jim	Boston	USA	43	4.3
2	Steven	London	UK	76	7.6
3	Joe	Madrid	Spain	12	1.8
4	Tom	Paris	France	89	13.4
'''

# 첫번째 시트 이름이 'sales' 였다.
# 처음 행, 컬럼을 기준으로 모두 공백이 있는 상태에서 자료를 가져오기 1

pd.read_excel('summer_raw.xls', sheet_name=1).head()

'''
	Unnamed: 0	Unnamed: 1	Unnamed: 2	Unnamed: 3	Unnamed: 4	Unnamed: 5	Unnamed: 6	Unnamed: 7	Unnamed: 8	Unnamed: 9	Unnamed: 10	Unnamed: 11
0	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
1	NaN	NaN	NaN	Year	City	Sport	Discipline	Athlete Name	Country	Gender	Event	Medal
2	NaN	NaN	0.0	1896	Athens	Aquatics	Swimming	HAJOS, Alfred	HUN	Men	100M Freestyle	Gold Medal
3	NaN	NaN	1.0	1896	Athens	Aquatics	Swimming	HERSCHMANN, Otto	AUT	Men	100M Freestyle	Silver
4	NaN	NaN	2.0	1896	Athens	Aquatics	Swimming	DRIVAS, Dimitrios	GRE	Men	100M Freestyle For Sailors	Bronze
'''
# 처음 행, 컬럼을 기준으로 모두 공백이 있는 상태에서 자료를 가져오기 2
# 처음으로 임포트해서 가져왔을때 최소한에 1번컬럼까지는 NaN값, 0번 행까지는 NaN값이 가득 차있었다.

pd.read_excel('summer_raw.xls', sheet_name= 1, usecols= 1)

# ValueError: Passing an integer for `usecols` is no longer supported.  Please pass in a list of int from 0 to `usecols` inclusive instead.
# 배운대로 하면 될것같았는데 안되네;
# 시도 1
# 나는 usecols로 접근했지만, 우선은 skiprows로 알려주시더라
# usecols에서 C: 처럼 완전 끝까지 슬라이싱 하는건 안먹지만, 엑셀파일을 확인해봤을때 마지막 컬럼의 이름을 알면 슬라이싱이 가능하다.
# index_col = 0 은 처음에 파일생성시 index = False라고 안되어있을경우에 다시한번 rangeindex가 활성화 되어서 나타나기 때문에
# 그것을 방지해주기 위해서 사용하는 것이다.

pd.read_excel('summer_raw.xls', sheet_name=1, skiprows= 2, usecols='C:L', index_col=0)

'''
	Year	City	Sport	Discipline	Athlete Name	Country	Gender	Event	Medal
0	1896	Athens	Aquatics	Swimming	HAJOS, Alfred	HUN	Men	100M Freestyle	Gold Medal
1	1896	Athens	Aquatics	Swimming	HERSCHMANN, Otto	AUT	Men	100M Freestyle	Silver
2	1896	Athens	Aquatics	Swimming	DRIVAS, Dimitrios	GRE	Men	100M Freestyle For Sailors	Bronze
3	1896	Athens	Aquatics	Swimming	Malokinis, Ioannis	GRE	Men	100M Freestyle For Sailors	Gold Medal
4	1896	Athens	Aquatics	Swimming	Chasapis, Spiridon	GRE	Men	100M Freestyle For Sailors	Silver
...	...	...	...	...	...	...	...	...	...
31165	2012	London	Wrestling	Wrestling Freestyle	JANIKOWSKI, Damian	POL	Men	Wg 84 KG	Bronze
31166	2012	London	Wrestling	Wrestling Freestyle	REZAEI, Ghasem Gholamreza	IRI	Men	Wg 96 KG	Gold
31167	2012	London	Wrestling	Wrestling Freestyle	TOTROV, Rustam	RUS	Men	Wg 96 KG	Silver
31168	2012	London	Wrestling	Wrestling Freestyle	ALEKSANYAN, Artur	ARM	Men	Wg 96 KG	Bronze
31169	2012	London	Wrestling	Wrestling Freestyle	LIDBERG, Jimmy	SWE	Men	Wg 96 KG	Bronze
31170 rows × 9 columns
'''

# 얼추 불러와진것같다.
summer = pd.read_excel('summer_raw.xls', sheet_name=1, skiprows=2, usecols='C:L', index_col=0)
summer.tail()

'''
	Year	City	Sport	Discipline	Athlete Name	Country	Gender	Event	Medal
31165	2012	London	Wrestling	Wrestling Freestyle	JANIKOWSKI, Damian	POL	Men	Wg 84 KG	Bronze
31166	2012	London	Wrestling	Wrestling Freestyle	REZAEI, Ghasem Gholamreza	IRI	Men	Wg 96 KG	Gold
31167	2012	London	Wrestling	Wrestling Freestyle	TOTROV, Rustam	RUS	Men	Wg 96 KG	Silver
31168	2012	London	Wrestling	Wrestling Freestyle	ALEKSANYAN, Artur	ARM	Men	Wg 96 KG	Bronze
31169	2012	London	Wrestling	Wrestling Freestyle	LIDBERG, Jimmy	SWE	Men	Wg 96 KG	Bronze
'''
summer.info()

'''
<class 'pandas.core.frame.DataFrame'>
Int64Index: 31170 entries, 0 to 31169
Data columns (total 9 columns):
 #   Column        Non-Null Count  Dtype 
---  ------        --------------  ----- 
 0   Year          31170 non-null  int64 
 1   City          31170 non-null  object
 2   Sport         31170 non-null  object
 3   Discipline    31170 non-null  object
 4   Athlete Name  31170 non-null  object
 5   Country       31166 non-null  object
 6   Gender        31170 non-null  object
 7   Event         31170 non-null  object
 8   Medal         31170 non-null  object
dtypes: int64(1), object(8)
memory usage: 2.4+ MB
'''

# 결측값은 없는 것으로 보인다.
# 가공해준 엑셀을 csv 파일로 전환하기
summer.to_csv('summer_imp.csv', index = False)
# 가공해준 엑셀을 다시 엑셀파일로 저장하기
summer.to_excel('summer_imp.xls', index = False)
300x250