중요한 함수 요약
isna() isnull() |
데이터값이 NaN값이라면 True, 아니면 False를 반환. |
notna() notnull() |
isna()와 반대로 데이터값이 NaN값이 라면 False, 아니면 True를 반환 |
read_csv() read_excel() read_html() |
주로 데이터프레임을 만들때 사용되는 함수들이다. encoding='utf-8' 또는 encoding='CP949'를 사용해 한글을 불러온다. |
![]() |
하나의 데이터 프레임은 서로다른 dtype을 갖고 있는 시리즈들이 담겨 있으며, 보통은 각 column마다 한 시리즈라고 생각하면 편하다. 각, 시리즈는 heterogeneous tabular data이다. 그래서 다양한 dtype을 갖게된다 또한, 시리즈는 ndarray타입으로 만들어져 있다. |
data1 = {'name' : ['Joe', 'John', 'Peter'] } | 데이터 프레임을 만들때 키값은 컬럼명이 된다. 즉 'name'이 컬럼명이며, 배열에들어있는 값들이 벨류가 된다. |
DataFrame(np.random.randint(10,100,16).reshape(4,4), index=list('ABCD'), columns=['one','two','three','four']) | np를 사용해서 데이터를 만들때 reshape함수를 사용하면 다차원 배열로 구성할수 있는데 주의해야할 사항은 벨류값들과 바꿀 차원의 크기가 갖아야 한다. 또한, 인덱스에서 라벨값들을 '문자'로만 지정을하고 싶으면 한번에 쓰는게 가능하지만 컬럼처럼 문자열을 사용할때는 리스트를 사용해서 넣어줘야 한다. |
컬럼명을 변경하는 방법에는 2가지가 있다. 1. 전체 컬럼 수정 = df.columns=['ab','cd','ef','ge'] 2. 부분 컬럼 수정 = df.rename(columns={'컬럼1':'컬럼2'}, inplace=True) |
1. 전체 컬럼을 수정할 때에는 갯수를 원본과 맞춰줘야 한다는 점이있다. 그래서 개인적인 생각으로는 부분 컬럼 수정을 많이 사용 할 거 같아 보인다. 2. 부분 컬럼 수정은 rename이라는 함수를 사용해서 딕셔너리의 키값을 바꾸듯이 사용을 하는데 여기서 inplace함수를 True로 선언을 안해주면, 디폴트 값인 False가 자동선언되면서 원본데이터에 적용이 되지 않는다. |
df.T (Transpose) |
Transpose는 딥러닝을 할때 많이 사용된다고 한다. 컬럼과 인덱스의 위치를 바꿀때 사용하며 이 함수를 이용해서 좀 더 다양하게 데이터 프레임을 사용할 수 있어보인다. |
1. df.iloc[:2] - 인덱스 2. df.loc[:2,'컬럼1':'컬럼3'] - 라벨 |
1. iloc 함수의 경우 index location으로, 인덱스 값에서 처음부터 2개반환한다. 2. loc 함수의 경우 처음부터 2개를 반환하면서, 컬럼값 컬럼1부터 컬럼3까지 반환한다. |
* 스칼라 값 가져오기. 1. df.iat[2,2] - 인덱스 2. df.at[2, '컬럼1'] - 라벨 |
1. iat 함수의 경우 Index at으로, 2번째 인덱스 2번째 컬럼의 값을 반환한다. 2. at 함수의 경우 라벨을 입력해서 가져오며, 2라는 라벨에 있는 컬럼1이라는 라벨의 컬럼명에 해당하는 위치의 값을 을 반환한다. |
1. df['컬럼4'] = np.nan 2. df.loc[4] = np.nan |
1.컬럼명을 '컬럼4'로 갖으며 NaN값을 넣는다. 2. 인덱스명을 '4'로 갖으며 NaN값을 넣는다. |
1. df.drop('컬럼4', axis=1, inplace=True) 2. df.drop(4, inplace=True) |
1. 컬럼명 '컬럼4'를 삭제하는 방법인데, axis은 축을 말한다. 기본값은 axis=0인데, 0은 (->) 행방향을 말한다 그리고 axis=1은 열방향을 말하므로, 컬럼값들이 대상이 되는걸 알 수 있다. 2. axis를 안써주면 기본값이므로, 인덱스명'4'의 값들이 drop함수에 의해서 삭제 된다. |
1. df.dropna() 2. df.fillna(0) |
1. dropna()의 기본값은 dropna(how = any)이다. how는 속성을 말하는데 any를 선언해주면, NaN값이 하나라도 있는 모든 행을 삭제한다. 추가로 - (how = all),(thresh=3)이 있다. all은 모든값이 NaN인 행만 삭제한다. thresh=3 은 값이 NaN값이 3개 이상인 값들을 반환한다. 2. 파라메터값으로 0 을 넣어주면, NaN의 값이 있는 자리에 '0'이라는 문자를 채워준다 df.fillna(df.mean())과 같이 함수를 넣어 그 시리즈의 평균 값을 넣을수도 있다. df.fillna(method='ffill') 은 시리즈에서 1번 인덱스의 값으로 NaN값에 채운다는 의미이다. |
1. df.sort_index(axis=1, ascending=False) 2. df.sort_values(by=['컬럼1'], ascending=False).head(10) 2-1. df.sort_values(by=['컬럼1'], ascending=False).head(10).plot(kind='bar') |
1. 인덱스를 정렬할때 사용하는 함수인데, axis=1을 주어서 열방향으로 맞추고 ascending=True가 기본값인데 False로 해주면 내림차순으로 정렬된다. 문자는 A-Z, ㄱ-ㅎ순으로 나열된다.(올림차순일경우) 2. sorting을 할때에 주로 많이 사용하는 함수이며, 컬럼명이 '컬럼1'이며, 내림차순으로정렬하였을때, 가장상위항목 10가지를 보여준다. 자주사용하게 될것으로 보인다. .plot(kind='bar')함수를 추가해서 'bar'차트로 출력할수 있다. |
df['컬럼1'].unique() | unique함수를 사용해서 '컬럼1'의 시리즈에 있는 값들을 1개씩만 보여준다. |
df['컬럼1'].value_counts() | '컬럼1'의 컬럼에있는 벨류값들의 갯수를 다 더해서 알려준다. |
Pandas는 Panel Datas의 줄임말로,
파이썬을 이용한 데이터 분석에서 가장 많이 사용되는 라이브러리이다.
Numpyt를 기반으로 만들어졋으며, 데이터 분석을 위한 효율적인 데이터구조를 제공한다.
ndarray - 다차원 배열
Pandas의 자료구조
1. Series - 1차원 배열형태 자료구조(벡터)
Series(ndarray, index)
인덱스를 지정안 하면 각 사이즈 별로 들어간다.
2. DataFrame - 2차원 배열형태 자료구조(메트릭스) 가장 많이 사용된다.
중요* 행을 구분하는 인덱스
중요* 열을 구분하는 컬럼
지정이 없으면 인덱스는 정수로 설정한다.
한번 지정된 인덱스는 변경되지 않는다.
3. Panel - 3차원 배열형태 자료구조
In [1]:
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
In [2]:
#ser1 = Series?
In [3]:
ser1 = Series
In [4]:
'''
Series(
data=None,
index=None,
dtype=None,
name=None,
copy=False,
fastpath=False,
)
모든 데이터는 배열형태로 넣어야 한다.
index를 명시적으로 지정하지 않으면 자동적으로 0 n-1까지의 정수로 지정된다.
'''
np.random.seed(100) # seed값으로 100을 넣어 랜덤값을 고정 시킨다.
# ser1 = Series(np.random.randint(10,20,5), index = ['a','b','c','d','e'])
ser1 = Series(np.random.randint(10,20,5), index = list('abcde'))
print(ser1) # 인덱스와 벨류를 반환한다.
print(ser1.index) # 인덱스만 반환
print(ser1.values) # 벨류만 반환
print(ser1.dtype) # 데이터 타입을 반환
a 18
b 18
c 13
d 17
e 17
dtype: int32
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
[18 18 13 17 17]
int32
시리즈 값 조회하기¶
중요~! 단일 값을 선택하거나 여러값을 선택할때
인덱싱과 슬라이싱이 나온다.
인덱스로 숫자나 라벨을 사용할 수 있다. 이때, 슬라이싱되는 방법이 달라진다.
1. 라벨사용
2. 숫자사용
슬라이싱은 방법이 다르다.
In [5]:
print(ser1['c']) # 인덱싱(라벨사용)
print(ser1[2]) # 인덱싱(숫자사용)
print(ser1['b':'d']) # 슬라이싱 (라벨사용) 마지막을 포함한다.
print(ser1[1:4]) # 슬라이싱 (숫자사용)
13
13
b 18
c 13
d 17
dtype: int32
b 18
c 13
d 17
dtype: int32
In [6]:
# 간단하게 응용해서 조회하기
ser1
Out[6]:
a 18
b 18
c 13
d 17
e 17
dtype: int32
In [7]:
ser1[::2] # 2칸씩 뛰어서 조회
Out[7]:
a 18
c 13
e 17
dtype: int32
In [8]:
ser1[:2]
Out[8]:
a 18
b 18
dtype: int32
In [9]:
ser1_1 = ser1[::2]
ser1
Out[9]:
a 18
b 18
c 13
d 17
e 17
dtype: int32
3. 시리즈 간의 연산과 누락 데이터 처리하기¶
In [10]:
print(ser1_1)
print(ser1)
a 18
c 13
e 17
dtype: int32
a 18
b 18
c 13
d 17
e 17
dtype: int32
In [11]:
result = ser1_1 + ser1
# 한쪽에 값이 없는경우 NaN으로 채워짐과 동시에 데이터 타입을 실수형으로 바뀐다. 바뀌는 이유는 NaN이 float64인것도 있고,
# int보다 더 큰 값으로 데이터형이 변하기 때문이다.
print(result)
a 36.0
b NaN
c 26.0
d NaN
e 34.0
dtype: float64
4. 누락테이터 조회하기 -¶
isnull() - 누락데이터를 조회할때 사용
notnull() - 누락데이터가 아닌것을 조회할때 사용
In [12]:
print(result.isnull())
print('*'*30)
print(result.notnull())
print('*'*30)
print(result.isnull().sum()) # 누락된 데이터의 갯수 출력
a False
b True
c False
d True
e False
dtype: bool
******************************
a True
b False
c True
d False
e True
dtype: bool
******************************
2
In [13]:
b_nan = print('\033[30m' + 'nan' + '\033[0m')
r_nan = print('\033[31m' + 'nan' + '\033[0m')
a = np.where(result.isnull(),'nan',False) #
b = np.where(result.isnull(),'nan',result.isnull()) #
c = result[result.isnull()] # nan만 나오게한다.
d = result[result.notnull()] # nan이 아닌것만 나오게 한다.
print(a)
print(b)
print(c)
print(d)
nan
nan
['False' 'nan' 'False' 'nan' 'False']
['False' 'nan' 'False' 'nan' 'False']
b NaN
d NaN
dtype: float64
a 36.0
c 26.0
e 34.0
dtype: float64
5. Matplot을 이용한 시각화¶
In [14]:
import matplotlib.pyplot as plt
In [15]:
# 누락테이터가 아닌 값들을 시각화해 본다.
result[result.notnull()].plot(kind='bar')
plt.show() # notnull인 데이터만 출력~!
In [16]:
result[result.isnull()].plot(kind='bar')
plt.show() # null인 데이터만 출력~! numeric한 것만 그래프 대상으로 잡는다. 지금 이건 바람직 하지 않음.
DataFrame은 2차원 배열형식, 표같은 스프레드 시트 자료구조
여러개의 컬럼을 가지며 서로다른 종류의 값이 담긴다.
DataFrame은 다양한 방법으로 생성할 수 있다.
가장 흔하게 사용할 수 있는 방법은 3가지가 있다.
1. 리스트 값을 딕셔너리로 만들수 있다.
2. Numpy배열을 이용해서 만들수 있다.
3. read_csv(), read_excel(), read_html() 옆의 세가지 함수들을 사용해서 만들수 있다.
3번째 방법을 가장 많이 사용한다
csv = comma, seperated, values
In [1]:
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
In [2]:
list_dic={'state' : ['Ohio','Ohio','Ohio','Nevada','Nevada','Nevada'],
'year' : [2000, 2001, 2002, 2001, 2002, 2003],
'pop' : [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
# DataFrame? potentially heterogeneous tabular data.로 인해 각각다른 dtype을 갖고 있다.
# 각각의 컬럼에 해당하는 상>하 방향의 한줄이 시리즈라고 보면된다.
# DataFrame은 시리즈들의 결합체,
# 시리즈는 ndarray타입으로 만들어져 있다.
dicDf = DataFrame(list_dic)
# 2가지 방법으로 컬럼명을 표현할 수 있다.
#print(type(dicDf.state))
#print(type(dicDf.year))
#print(type(dicDf.pop))
print(type(dicDf['state']))
print(type(dicDf['year']))
print(type(dicDf['pop']))
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
In [3]:
# 데이터 프레임을 만들때 키값은 컬럼명이 된다.
data1 = {'name' : ['James', 'Peter','Robert','Tom'],
'address' : ['NY', 'NY', 'LA','Texas'],
'age' : [33,44,55,66]}
df1 = DataFrame(data1)
df1
Out[3]:
name | address | age | |
---|---|---|---|
0 | James | NY | 33 |
1 | Peter | NY | 44 |
2 | Robert | LA | 55 |
3 | Tom | Texas | 66 |
2. DataFrame생성 - Numpy 배열 사용¶
In [4]:
# 1. df2 = DataFrame(np.random.randint(10,100,16))
# reshape를 사용해서 차원을 변형해준다. .reshape(4,4) 갯수 맞춰 줘야한다.
df2 = DataFrame(np.random.randint(10,100,16).reshape(4,4))
df2
Out[4]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 19 | 60 | 40 | 13 |
1 | 15 | 94 | 92 | 31 |
2 | 48 | 28 | 17 | 67 |
3 | 94 | 54 | 14 | 84 |
In [5]:
# 인덱스와 컬럼을 직접 지정해주자
# 컬럼명을 지정해줄때 문자열이면 배열을 따로 만들어서 넣어줘야 한다.
df2 = DataFrame(np.random.randint(10,100,16).reshape(4,4),index=list('ABCD'), columns=['ONE','TWO','THREE','FOUR'])
df2
Out[5]:
ONE | TWO | THREE | FOUR | |
---|---|---|---|---|
A | 69 | 20 | 52 | 27 |
B | 51 | 36 | 22 | 54 |
C | 28 | 54 | 37 | 93 |
D | 88 | 50 | 84 | 22 |
3. DataFrame 생성 - read_csv() 함수 사용¶
In [6]:
'''
csv 는 콤마를 기준으로 분류 되어있다.
데이터를 뽑아낼때는 인덱스나 컬럼으로 뽑아낼수 있다.
데이터 전략 > 데이터에 대한 예리한 분석, 전략을 세워야한다.
누락데이터가 어디에 들어있는지 정도는 확인해두고 간다. 마지막행에는 무조건 NaN이 들어간다.
'''
df3 = pd.read_csv('../data/tips.csv') # 레스토랑 정보.
df3
Out[6]:
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2.0 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3.0 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3.0 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2.0 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4.0 |
... | ... | ... | ... | ... | ... | ... | ... |
240 | 27.18 | 2.00 | Female | Yes | Sat | Dinner | 2.0 |
241 | 22.67 | 2.00 | Male | Yes | Sat | Dinner | 2.0 |
242 | 17.82 | 1.75 | Male | No | Sat | Dinner | 2.0 |
243 | 18.78 | 3.00 | Female | No | Thur | Dinner | 2.0 |
244 | 25.34 | NaN | NaN | NaN | NaN | NaN | NaN |
245 rows × 7 columns
4. DataFrame - 구조¶
In [7]:
df1
Out[7]:
name | address | age | |
---|---|---|---|
0 | James | NY | 33 |
1 | Peter | NY | 44 |
2 | Robert | LA | 55 |
3 | Tom | Texas | 66 |
In [8]:
print('df1.index : ',df1.index)
print('*'*30)
print('df1.columns : ', df1.columns) #리스트형
print('*'*30)
print('df1.values : ' ,df1.values) # 2차원
print('*'*30)
print('df1.dtypes : ' ,df1.dtypes) # 컬럼에 대한 타입명이 나온다.
print('*'*30)
print('df1.T : ', df1.T) #T는 (Transpose = 행과 열을 뒤바꾼다.)
print('*'*30)
df1.info()
df1.index : RangeIndex(start=0, stop=4, step=1)
******************************
df1.columns : Index(['name', 'address', 'age'], dtype='object')
******************************
df1.values : [['James' 'NY' 33]
['Peter' 'NY' 44]
['Robert' 'LA' 55]
['Tom' 'Texas' 66]]
******************************
df1.dtypes : name object
address object
age int64
dtype: object
******************************
df1.T : 0 1 2 3
name James Peter Robert Tom
address NY NY LA Texas
age 33 44 55 66
******************************
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 4 non-null object
1 address 4 non-null object
2 age 4 non-null int64
dtypes: int64(1), object(2)
memory usage: 224.0+ bytes
In [9]:
print(df3)
print('*'*30)
print(df3.head()) #head()의 기본 값은 5개 이다.
print('*'*30)
print(df3.head(12)) #상단에서 부터 시작해서 12개만 보여줌
print('*'*30)
print(df3.tail()) # 디폴트값 = 끝에서 부터 5번째줄 부터 보여줌
print('*'*30)
print(df3.tail(2)) # 끝에서 부터 앞으로 2칸 (n-2칸부터 자료를 출력한다.)
print('*'*30)
print(df3.shape) # 이 함수는 배열의 형태를 튜플로 반환합니다. (245, 7)> 245행 7열 즉, 7개의 시리즈값을 갖는다.
print('*'*30)
print(df3.T)
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2.0
1 10.34 1.66 Male No Sun Dinner 3.0
2 21.01 3.50 Male No Sun Dinner 3.0
3 23.68 3.31 Male No Sun Dinner 2.0
4 24.59 3.61 Female No Sun Dinner 4.0
.. ... ... ... ... ... ... ...
240 27.18 2.00 Female Yes Sat Dinner 2.0
241 22.67 2.00 Male Yes Sat Dinner 2.0
242 17.82 1.75 Male No Sat Dinner 2.0
243 18.78 3.00 Female No Thur Dinner 2.0
244 25.34 NaN NaN NaN NaN NaN NaN
[245 rows x 7 columns]
******************************
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2.0
1 10.34 1.66 Male No Sun Dinner 3.0
2 21.01 3.50 Male No Sun Dinner 3.0
3 23.68 3.31 Male No Sun Dinner 2.0
4 24.59 3.61 Female No Sun Dinner 4.0
******************************
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2.0
1 10.34 1.66 Male No Sun Dinner 3.0
2 21.01 3.50 Male No Sun Dinner 3.0
3 23.68 3.31 Male No Sun Dinner 2.0
4 24.59 3.61 Female No Sun Dinner 4.0
5 25.29 4.71 Male No Sun Dinner 4.0
6 8.77 2.00 Male No Sun Dinner 2.0
7 26.88 3.12 Male No Sun Dinner 4.0
8 15.04 1.96 Male No Sun Dinner 2.0
9 14.78 3.23 Male No Sun Dinner 2.0
10 10.27 1.71 Male No Sun Dinner 2.0
11 35.26 5.00 Female No Sun Dinner 4.0
******************************
total_bill tip sex smoker day time size
240 27.18 2.00 Female Yes Sat Dinner 2.0
241 22.67 2.00 Male Yes Sat Dinner 2.0
242 17.82 1.75 Male No Sat Dinner 2.0
243 18.78 3.00 Female No Thur Dinner 2.0
244 25.34 NaN NaN NaN NaN NaN NaN
******************************
total_bill tip sex smoker day time size
243 18.78 3.0 Female No Thur Dinner 2.0
244 25.34 NaN NaN NaN NaN NaN NaN
******************************
(245, 7)
******************************
0 1 2 3 4 5 6 7 \
total_bill 16.99 10.34 21.01 23.68 24.59 25.29 8.77 26.88
tip 1.01 1.66 3.5 3.31 3.61 4.71 2 3.12
sex Female Male Male Male Female Male Male Male
smoker No No No No No No No No
day Sun Sun Sun Sun Sun Sun Sun Sun
time Dinner Dinner Dinner Dinner Dinner Dinner Dinner Dinner
size 2 3 3 2 4 4 2 4
8 9 ... 235 236 237 238 239 \
total_bill 15.04 14.78 ... 10.07 12.6 32.83 35.83 29.03
tip 1.96 3.23 ... 1.25 1 1.17 4.67 5.92
sex Male Male ... Male Male Male Female Male
smoker No No ... No Yes Yes No No
day Sun Sun ... Sat Sat Sat Sat Sat
time Dinner Dinner ... Dinner Dinner Dinner Dinner Dinner
size 2 2 ... 2 2 2 3 3
240 241 242 243 244
total_bill 27.18 22.67 17.82 18.78 25.34
tip 2 2 1.75 3 NaN
sex Female Male Male Female NaN
smoker Yes Yes No No NaN
day Sat Sat Sat Thur NaN
time Dinner Dinner Dinner Dinner NaN
size 2 2 2 2 NaN
[7 rows x 245 columns]
1. DataFrame - 컬럼명 변경 및 추가¶
In [1]:
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
In [2]:
# 데이터 프레임을 만들때 키값은 컬럼명이 된다.
data1 = {'name' : ['James', 'Peter','Robert','Tom'],
'address' : ['NY', 'NY', 'LA','Texas'],
'age' : [33,44,55,66]}
df1 = DataFrame(data1)
df1
Out[2]:
name | address | age | |
---|---|---|---|
0 | James | NY | 33 |
1 | Peter | NY | 44 |
2 | Robert | LA | 55 |
3 | Tom | Texas | 66 |
In [3]:
df2 = DataFrame(np.random.randint(10,100,16).reshape(4,4),index=list('ABCD'), columns=['one','two','three','four'])
df2
Out[3]:
one | two | three | four | |
---|---|---|---|---|
A | 10 | 93 | 53 | 48 |
B | 41 | 34 | 10 | 92 |
C | 30 | 22 | 96 | 54 |
D | 69 | 59 | 70 | 83 |
In [4]:
# 1. 컬럼명 변경
'''
2가지 방법
1. 전체 컬럼 수정 = df2.columns
2. 부분 컬럼 수정 = df1.rename(columns={'address': 'addr'}, inplace=True)
'''
df2.columns = ['A-class','B-class','C-class','D-class']
df2
Out[4]:
A-class | B-class | C-class | D-class | |
---|---|---|---|---|
A | 10 | 93 | 53 | 48 |
B | 41 | 34 | 10 | 92 |
C | 30 | 22 | 96 | 54 |
D | 69 | 59 | 70 | 83 |
In [5]:
df1
Out[5]:
name | address | age | |
---|---|---|---|
0 | James | NY | 33 |
1 | Peter | NY | 44 |
2 | Robert | LA | 55 |
3 | Tom | Texas | 66 |
In [6]:
df1.rename(columns={'address': 'addr'}, inplace=True) # 원본에 직접 변경 하려면 inplace를 True 로 설정해야한다. 기본값은 False
print('원본')
print(df1)
print('*'*30)
print('복사본')
# 복사해서 사용할 경우
df1_1 = df1.rename(columns={'address': 'addr'})
print(df1_1)
print('*'*30)
print('컬럼과 인덱스의 위치를 바꿈 딥러닝때 주로 사용한다. (Transpose를 사용) ')
print(df1_1.T)
원본
name addr age
0 James NY 33
1 Peter NY 44
2 Robert LA 55
3 Tom Texas 66
******************************
복사본
name addr age
0 James NY 33
1 Peter NY 44
2 Robert LA 55
3 Tom Texas 66
******************************
컬럼과 인덱스의 위치를 바꿈 딥러닝때 주로 사용한다. (Transpose를 사용)
0 1 2 3
name James Peter Robert Tom
addr NY NY LA Texas
age 33 44 55 66
2. DataFrame - 조회하기¶
In [7]:
df2.columns = ['one','two','three','four' ]
df2
Out[7]:
one | two | three | four | |
---|---|---|---|---|
A | 10 | 93 | 53 | 48 |
B | 41 | 34 | 10 | 92 |
C | 30 | 22 | 96 | 54 |
D | 69 | 59 | 70 | 83 |
In [8]:
# 숫자 슬라이싱 = 마지막 숫자 n-1까지.
df2[0:2]
Out[8]:
one | two | three | four | |
---|---|---|---|---|
A | 10 | 93 | 53 | 48 |
B | 41 | 34 | 10 | 92 |
In [9]:
# 문자 슬라이싱 = 마지막 문자까지. 즉, 포함한다.
df2['A':'B']
Out[9]:
one | two | three | four | |
---|---|---|---|---|
A | 10 | 93 | 53 | 48 |
B | 41 | 34 | 10 | 92 |
In [10]:
# 트렌스포즈를 사용해서 컬럼명도 조회할 수 있다.
df2.T['one':'three']
Out[10]:
A | B | C | D | |
---|---|---|---|---|
one | 10 | 41 | 30 | 69 |
two | 93 | 34 | 22 | 59 |
three | 53 | 10 | 96 | 70 |
In [11]:
df2[['one','three']] # 2차원이므로 사용해서 출력해 낼수 있다. 컬럼을 출력할 수도 있다.
Out[11]:
one | three | |
---|---|---|
A | 10 | 53 |
B | 41 | 10 |
C | 30 | 96 |
D | 69 | 70 |
In [12]:
# df2[['one','three']]
# print(df2[df2['two']>45])
# print('*'*30)
# 3 two 컬럼에서 45보다 큰값들만 출력하세요...
# 함수 사용하지 않고 two의 컬럼 출력하기
print('*'*30)
print(df2.get('two'))
print('*'*30)
print(df2[df2['two']>45])
print('*'*30)
df2[df2['two']>45][['two']]
print('*'*30)
a = df2[df2['two']>45]
print('*'*30)
print(a[['two']])
print('*'*30,'asdasd')
df2[df2['two'] > 45]['two']
print('*'*30)
# loc 와 iloc를 사용해서 two의 컬럼 출력하기.
print(df2.iloc[:,1])
print('*'*30)
print(df2.loc[:,'two'])
******************************
A 93
B 34
C 22
D 59
Name: two, dtype: int32
******************************
one two three four
A 10 93 53 48
D 69 59 70 83
******************************
******************************
******************************
two
A 93
D 59
****************************** asdasd
******************************
A 93
B 34
C 22
D 59
Name: two, dtype: int32
******************************
A 93
B 34
C 22
D 59
Name: two, dtype: int32
3. loc, iloc, at, iat¶
df
In [13]:
df1
Out[13]:
name | addr | age | |
---|---|---|---|
0 | James | NY | 33 |
1 | Peter | NY | 44 |
2 | Robert | LA | 55 |
3 | Tom | Texas | 66 |
In [14]:
print(df1.iloc[0:2, 0:3]) # [0~1(행), 0~2(열)]
print('*'*30)
print(df1.iloc[:2,:3])
print('*'*30)
print(df1.iloc[0:2])
print('*'*30)
print(df1.iloc[:2])
name addr age
0 James NY 33
1 Peter NY 44
******************************
name addr age
0 James NY 33
1 Peter NY 44
******************************
name addr age
0 James NY 33
1 Peter NY 44
******************************
name addr age
0 James NY 33
1 Peter NY 44
In [15]:
df1
Out[15]:
name | addr | age | |
---|---|---|---|
0 | James | NY | 33 |
1 | Peter | NY | 44 |
2 | Robert | LA | 55 |
3 | Tom | Texas | 66 |
In [16]:
# loc는 라벨로 인식한다. iloc는 인덱스값으로 인식한다.
print(df1.loc[0:1]) # [0~1(행), 0~2(열)]
print('*'*30)
print(df1.loc[0:1,'name':'addr'])
print('*'*30)
print(df1.loc[:,'name':])
name addr age
0 James NY 33
1 Peter NY 44
******************************
name addr
0 James NY
1 Peter NY
******************************
name addr age
0 James NY 33
1 Peter NY 44
2 Robert LA 55
3 Tom Texas 66
In [17]:
df1
Out[17]:
name | addr | age | |
---|---|---|---|
0 | James | NY | 33 |
1 | Peter | NY | 44 |
2 | Robert | LA | 55 |
3 | Tom | Texas | 66 |
In [18]:
# iat, at을 사용해서 스칼라값 가져오기
# Robert의 나이 가져오기
print(df1.at[2,'age'])
# 로버트 나이
print(df1.at[3,'addr'])
# iat은 인덱스로 검색한다.
# 피터주소
print(df1.iat[1,1])
# 로버트 나이
print(df1.iat[2,2])
55
Texas
NY
55
4. 누락데이터 추가및 삭제하기¶
dropna()
In [19]:
df1['phone'] = np.nan # 컬럼 추가
df1
df1.loc[4] = np.nan
df1
Out[19]:
name | addr | age | phone | |
---|---|---|---|---|
0 | James | NY | 33.0 | NaN |
1 | Peter | NY | 44.0 | NaN |
2 | Robert | LA | 55.0 | NaN |
3 | Tom | Texas | 66.0 | NaN |
4 | NaN | NaN | NaN | NaN |
In [20]:
# 데이터 삭제하기
df1.drop(4, inplace=True)
df1
Out[20]:
name | addr | age | phone | |
---|---|---|---|---|
0 | James | NY | 33.0 | NaN |
1 | Peter | NY | 44.0 | NaN |
2 | Robert | LA | 55.0 | NaN |
3 | Tom | Texas | 66.0 | NaN |
In [21]:
df1
Out[21]:
name | addr | age | phone | |
---|---|---|---|---|
0 | James | NY | 33.0 | NaN |
1 | Peter | NY | 44.0 | NaN |
2 | Robert | LA | 55.0 | NaN |
3 | Tom | Texas | 66.0 | NaN |
In [22]:
df1['phone'] = np.nan # 컬럼 추가
df1
df1.loc[4] = np.nan
df1
Out[22]:
name | addr | age | phone | |
---|---|---|---|---|
0 | James | NY | 33.0 | NaN |
1 | Peter | NY | 44.0 | NaN |
2 | Robert | LA | 55.0 | NaN |
3 | Tom | Texas | 66.0 | NaN |
4 | NaN | NaN | NaN | NaN |
In [23]:
# drop함수를 이용해서 phone 컬럼을 삭제해라
df1.drop('age',axis=1,inplace=True)
In [24]:
df1.drop(4,inplace=True)
In [25]:
df1
Out[25]:
name | addr | phone | |
---|---|---|---|
0 | James | NY | NaN |
1 | Peter | NY | NaN |
2 | Robert | LA | NaN |
3 | Tom | Texas | NaN |
In [26]:
df1.drop('phone',inplace=True,axis=1)
In [27]:
df1
Out[27]:
name | addr | |
---|---|---|
0 | James | NY |
1 | Peter | NY |
2 | Robert | LA |
3 | Tom | Texas |
In [28]:
##!! age다시 추가해보기
5. 누락데이터 삭제하기 - dropna()¶
판다스에서는 누락데이터를 모두 NaN으로 처리한다.
통계함수는 누락데이터를 배제하고 연산한다.
dropna()는 nan값이 하나라도 있는 모든 행을 삭제 한다.
dropna(how='all') - 모든 값이 NaN인 행만 삭제
dropna(how='any') - 이것은 dropna()의 디폴트 값이다.
dropna(thresh=3) - NaN이 2개 있으면 삭제한다.
#df[['측정일시','측정소코드','오존(ppm)']].dropna(subset=['오존(ppm)'])
-----------------------------------------------------------------
5. 누락데이터 채우기 - fillna()¶
fillna() - 누락데이터를 채워주는 함수이다.
* 참고 *
isnull()
notnull()
In [29]:
from numpy import nan as NA
df = DataFrame([[1,6.5,3],[1,NA,NA],[NA,NA,NA],[NA,6.5,3]])
df
Out[29]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
2 | NaN | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
In [30]:
removeNa = df.dropna()
removeNa
Out[30]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
In [31]:
df
Out[31]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
2 | NaN | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
In [32]:
df.dropna(how='all')
Out[32]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
In [33]:
df
Out[33]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
2 | NaN | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
In [34]:
df.dropna(thresh = 2)
Out[34]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
3 | NaN | 6.5 | 3.0 |
In [35]:
df.fillna(0)
Out[35]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | 0.0 | 0.0 |
2 | 0.0 | 0.0 | 0.0 |
3 | 0.0 | 6.5 | 3.0 |
In [36]:
df
Out[36]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
2 | NaN | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
In [37]:
df.fillna(df.mean())
Out[37]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | 6.5 | 3.0 |
2 | 1.0 | 6.5 | 3.0 |
3 | 1.0 | 6.5 | 3.0 |
In [38]:
df
Out[38]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
2 | NaN | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
In [39]:
df.fillna(5)
Out[39]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | 5.0 | 5.0 |
2 | 5.0 | 5.0 | 5.0 |
3 | 5.0 | 6.5 | 3.0 |
In [40]:
df
Out[40]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | NaN | NaN |
2 | NaN | NaN | NaN |
3 | NaN | 6.5 | 3.0 |
In [41]:
df.fillna(method='ffill') # first fill 첫번째 것으로 채운다.
Out[41]:
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | 6.5 | 3.0 |
1 | 1.0 | 6.5 | 3.0 |
2 | 1.0 | 6.5 | 3.0 |
3 | 1.0 | 6.5 | 3.0 |
6. DataFrame - 정렬하기¶
sort_index()
sort_values()
In [42]:
df2
Out[42]:
one | two | three | four | |
---|---|---|---|---|
A | 10 | 93 | 53 | 48 |
B | 41 | 34 | 10 | 92 |
C | 30 | 22 | 96 | 54 |
D | 69 | 59 | 70 | 83 |
In [43]:
df2.sort_index()
Out[43]:
one | two | three | four | |
---|---|---|---|---|
A | 10 | 93 | 53 | 48 |
B | 41 | 34 | 10 | 92 |
C | 30 | 22 | 96 | 54 |
D | 69 | 59 | 70 | 83 |
In [44]:
df2.sort_index(axis=1, ascending=False)
Out[44]:
two | three | one | four | |
---|---|---|---|---|
A | 93 | 53 | 10 | 48 |
B | 34 | 10 | 41 | 92 |
C | 22 | 96 | 30 | 54 |
D | 59 | 70 | 69 | 83 |
In [45]:
df2.sort_values('one')
Out[45]:
one | two | three | four | |
---|---|---|---|---|
A | 10 | 93 | 53 | 48 |
C | 30 | 22 | 96 | 54 |
B | 41 | 34 | 10 | 92 |
D | 69 | 59 | 70 | 83 |
실전데이터로 응용하기¶
In [46]:
df3 = pd.read_csv('../data/tips.csv') # 레스토랑 정보.
df3.head(3)
Out[46]:
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2.0 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3.0 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3.0 |
In [47]:
# 문제 1. tip이라는 컬럼으로 정렬.. 내림차순정렬... 샘플데이터 5개만 디스플레이
df3.sort_values(by=['tip'], ascending=False).head()
Out[47]:
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
170 | 50.81 | 10.00 | Male | Yes | Sat | Dinner | 3.0 |
212 | 48.33 | 9.00 | Male | No | Sat | Dinner | 4.0 |
23 | 39.42 | 7.58 | Male | No | Sat | Dinner | 4.0 |
59 | 48.27 | 6.73 | Male | No | Sat | Dinner | 4.0 |
141 | 34.30 | 6.70 | Male | No | Thur | Lunch | 6.0 |
In [48]:
# 위의 결과를 정렬된 결과를 시각화 해서
df3.sort_values(by=['tip'], ascending=False).head().plot(kind='bar')
Out[48]:
<AxesSubplot:>
In [49]:
df3.sort_values(by=['tip'], ascending=False).head().plot(kind='bar')
#plt.show()
Out[49]:
<AxesSubplot:>
In [50]:
# 문제 2. day와 tip컬럼을 차례로 정렬 day는 내림 tip오름 차순
# 나뉘면 무조건 리스트쓰면댐
df3.sort_values(by=['day','tip'],ascending=[False, True]).tail(7).plot(kind='bar')
Out[50]:
<AxesSubplot:>
In [51]:
df3['day']
Out[51]:
0 Sun
1 Sun
2 Sun
3 Sun
4 Sun
...
240 Sat
241 Sat
242 Sat
243 Thur
244 NaN
Name: day, Length: 245, dtype: object
In [52]:
df3['day'].unique() # 중복
Out[52]:
array(['Sun', 'Sat', 'Thur', 'Fri', nan], dtype=object)
In [53]:
df3['day'].value_counts()
Out[53]:
Sat 87
Sun 76
Thur 62
Fri 19
Name: day, dtype: int64
'workSpace > PYTHON' 카테고리의 다른 글
[Pandas] 판다스 기초 상식 정리 및 함수 응용 1 - 서울시 기간별 시간평균 대기환경 정보 데이터 분석 (0) | 2021.01.13 |
---|---|
[Pandas] 판다스 기초 상식 및 함수 정리 2 - concat, merge (0) | 2021.01.13 |
[Numpy] 넘파이 기초 상식 및 함수 정리 - 기초 함수, 응용 문제 (0) | 2021.01.12 |
[Numpy] Numpy 문제 모음 정답 및 설명 (100 numpy exercises) - ing (0) | 2021.01.11 |
[Numpy] Numpy 문제 모음 (100 numpy exercises) (0) | 2021.01.11 |