티스토리 뷰
안녕하세요. 감자 코딩에 감자개발자 입니다. 이번에 알아볼 것들은 Pandas Package입니다.
1. Pandas란?
데이터 분석, 데이터 처리 등을 쉽게 하기 위해 만들어진 python package 보다 안정적으로 대용량 데이터들을 쉽게 처리할 수 있음.
대표적인 Pandas 자료구조 2가지
2. Series란?
Series는 value와 index의 형태를 지니는 Pandas의 자료 구조이다.
아래 그림과 같이 [1,3,5,7]의 값을 가지는 리스트를 Series로 생성하게 되면 (1,3,5,7)이라는 value와 (0,1,2,3)이라는 index가
생성되어 Series라는 형태의 자료 구조를 만든다.
3. DataFrame이란?
DataFrame은 여러 개의 Dictionary를 처리하는데 있어 Series보다 보기 편한 형태로 제공해 줄 수 있는 자료 구조.
Ex) 엑셀의 표 모양
4. 실습 해보기
Series 정의하기
obj = pd.Series([4, 7, -5, 3])
obj
Out[3]:
In [4]:
# Series의 값만 확인하기
obj.values
Out[4]:
In [5]:
# Series의 인덱스만 확인하기
obj.index
Out[5]:
In [7]:
# Series의 자료형 확인하기
obj.dtypes
Out[7]:
In [8]:
# 인덱스를 바꿀 수 있다.
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj2
Out[8]:
In [10]:
# python의 dictionary 자료형을 Series data로 만들 수 있다.
# dictionary의 key가 Series의 index가 된다
sdata = {'Kim': 35000, 'Beomwoo': 67000, 'Joan': 12000, 'Choi': 4000}
obj3 = pd.Series(sdata)
obj3
Out[10]:
In [12]:
obj3.name = 'Salary'
obj3.index.name = "Names"
obj3
Out[12]:
In [13]:
# index 변경
obj3.index = ['A', 'B', 'C', 'D']
obj3
Out[13]:
In [23]:
# Data Frame 정의하기
# 이전에 DataFrame에 들어갈 데이터를 정의해주어야 하는데,
# 이는 python의 dictionary 또는 numpy의 array로 정의할 수 있다.
data = {'name': ['Beomwoo', 'Beomwoo', 'Beomwoo', 'Kim', 'Park'],
'year': [2013, 2014, 2015, 2016, 2015],
'points': [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data)
df
Out[23]:
In [24]:
# 행과 열의 구조를 가진 데이터가 생긴다.
In [25]:
# 행 방향의 index
df.index
Out[25]:
In [26]:
# 열 방향의 index
df.columns
Out[26]:
In [27]:
# 값 얻기
df.values
Out[27]:
In [28]:
# 각 인덱스에 대한 이름 설정하기
df.index.name = 'Num'
df.columns.name = 'Info'
df
Out[28]:
In [29]:
# DataFrame을 만들면서 columns와 index를 설정할 수 있다.
df2 = pd.DataFrame(data, columns=['year', 'name', 'points', 'penalty'],
index=['one', 'two', 'three', 'four', 'five'])
df2
Out[29]:
In [31]:
# describe() 함수는 DataFrame의 계산 가능한 값들에 대한 다양한 계산 값을 보여준다.
df2.describe()
Out[31]:
In [33]:
data = {"names": ["Kilho", "Kilho", "Kilho", "Charles", "Charles"],
"year": [2014, 2015, 2016, 2015, 2016],
"points": [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data, columns=["year", "names", "points", "penalty"],
index=["one", "two", "three", "four", "five"])
df
Out[33]:
In [34]:
df['year']
Out[34]:
In [36]:
# 동일한 의미를 갖는, 다른 방법
df.year
Out[36]:
In [37]:
df[['year','points']]
Out[37]:
In [38]:
# 특정 열에 대해 위와 같이 선택하고, 우리가 원하는 값을 대입할 수 있다.
df['penalty'] = 0.5
In [39]:
df
Out[39]:
In [42]:
# 또는
df['penalty'] = [0.1, 0.2, 0.3, 0.4, 0.5] # python의 List나 numpy의 array
In [43]:
df
Out[43]:
In [44]:
# 새로운 열을 추가하기
df['zeros'] = np.arange(5)
In [45]:
df
Out[45]:
In [49]:
# Series를 추가할 수도 있다.
val = pd.Series([-1.2, -1.5, -1.7], index=['two','four','five'])
In [50]:
df['debt'] = val
In [51]:
df
Out[51]:
In [52]:
df['net_points'] = df['points'] - df['penalty']
In [53]:
df['high_points'] = df['net_points'] > 2.0
In [54]:
df
Out[54]:
In [55]:
# 열 삭제하기
del df['high_points']
In [56]:
del df['net_points']
del df['zeros']
In [57]:
df
Out[57]:
In [58]:
df.columns
Out[58]:
In [59]:
df.index.name = 'Order'
df.columns.name = 'Info'
In [60]:
df
Out[60]:
In [61]:
# 0번째 부터 2(3-1) 번째까지 가져온다.
# 뒤에 써준 숫자번째의 행은 뺀다.
df[0:3]
Out[61]:
In [63]:
# tow라는 행부터 four라는 행까지 가져온다.
# 뒤에 써준 이름의 행을 빼지 않는다.
df['two':'four'] # 하지만 비추천!
Out[63]:
In [65]:
# 아래 방법을 권장한다.
# .loc 또는 .iloc 함수를 사용하는 방법.
df.loc['two'] # 반환 형태는 Series
Out[65]:
In [67]:
df.loc['two':'four']
Out[67]:
In [69]:
df.loc['two':'four', 'points']
Out[69]:
In [70]:
df.loc[:,'year'] # == df['year']
Out[70]:
In [71]:
df.loc[:,['year','names']]
Out[71]:
In [72]:
df.loc['three':'five','year':'penalty']
Out[72]:
In [73]:
# 새로운 행 삽입하기
df.loc['six',:] = [2013,'Jun',4.0,0.1,2.1]
In [74]:
df
Out[74]:
In [79]:
# .iloc 사용:: index 번호를 사용한다.
df.iloc[3] # 3번째 행을 가져온다.
Out[79]:
In [80]:
df.iloc[3:5, 0:2]
Out[80]:
In [81]:
df.iloc[[0,1,3], [1,2]]
Out[81]:
In [83]:
df.iloc[:,1:4]
Out[83]:
In [84]:
df.iloc[1,1]
Out[84]:
In [85]:
df
Out[85]:
In [87]:
# year가 2014보다 큰 boolean data
df['year'] > 2014
Out[87]:
In [89]:
# year가 2014보다 큰 모든 행의 값
df.loc[df['year']>2014,:]
Out[89]:
In [90]:
df.loc[df['names'] == 'Kilho',['names','points']]
Out[90]:
In [92]:
# numpy에서와 같이 논리연산을 응용할 수 있다.
df.loc[(df['points']>2)&(df['points']<3),:]
Out[92]:
In [93]:
# 새로운 값을 대입할 수도 있다.
df.loc[df['points'] > 3, 'penalty'] = 0
In [94]:
df
Out[94]:
In [95]:
# DataFrame을 만들때 index, column을 설정하지 않으면 기본값으로 0부터 시작하는 정수형 숫자로 입력된다.
df = pd.DataFrame(np.random.randn(6,4))
df
Out[95]:
In [98]:
df.columns = ['A', 'B', 'C', 'D']
df.index = pd.date_range('20160701', periods=6)
#pandas에서 제공하는 date range함수는 datetime 자료형으로 구성된, 날짜 시각등을 알 수 있는 자료형을 만드는 함수
df.index
Out[98]:
In [99]:
df
Out[99]:
In [101]:
# np.nan은 NaN값을 의미한다.
df['F'] = [1.0, np.nan, 3.5, 6.1, np.nan, 7.0]
df
Out[101]:
In [102]:
# 행의 값중 하나라도 nan인 경우 그 행을 없앤다.
df.dropna(how='any')
Out[102]:
In [103]:
# 행의 값의 모든 값이 nan인 경우 그 행으 없앤다.
df.dropna(how='all')
Out[103]:
In [104]:
# nan값에 값 넣기
df.fillna(value=0.5)
Out[104]:
In [107]:
# nan값인지 확인하기
df.isnull()
Out[107]:
In [109]:
# F열에서 nan값을 포함하는 행만 추출하기
df.loc[df.isnull()['F'],:]
Out[109]:
In [110]:
pd.to_datetime('20160701')
Out[110]:
In [111]:
# 특정 행 drop하기
df.drop(pd.to_datetime('20160701'))
Out[111]:
In [112]:
# 2개 이상도 가능
df.drop([pd.to_datetime('20160702'),pd.to_datetime('20160704')])
Out[112]:
In [113]:
# 특정 열 삭제하기
df.drop('F', axis = 1)
Out[113]:
In [114]:
# 2개 이상의 열도 가능
df.drop(['B','D'], axis = 1)
Out[114]:
In [115]:
data = [[1.4, np.nan],
[7.1, -4.5],
[np.nan, np.nan],
[0.75, -1.3]]
df = pd.DataFrame(data, columns=["one", "two"], index=["a", "b", "c", "d"])
In [116]:
df
Out[116]:
In [118]:
# 행방향으로의 합(즉, 각 열의 합)
df.sum(axis=0)
Out[118]:
In [119]:
# 열방향으로의 합(즉, 각 행의 합)
df.sum(axis=1)
Out[119]:
In [123]:
df.sum(axis=1, skipna=False)
Out[123]:
In [120]:
# 특정 행 또는 특정 열에서만 계산하기
df['one'].sum()
Out[120]:
In [121]:
df.loc['b'].sum()
Out[121]:
In [125]:
df2 = pd.DataFrame(np.random.randn(6, 4),
columns=["A", "B", "C", "D"],
index=pd.date_range("20160701", periods=6))
df2
Out[125]:
In [127]:
# A열과 B열의 상관계수 구하기
df2['A'].corr(df2['B'])
Out[127]:
In [128]:
# B열과 C열의 공분산 구하기
df2['B'].cov(df2['C'])
Out[128]:
In [130]:
dates = df2.index
random_dates = np.random.permutation(dates)
df2 = df2.reindex(index=random_dates, columns=["D", "B", "C", "A"])
df2
Out[130]:
In [131]:
# index와 column의 순서가 섞여있다.
# 이때 index가 오름차순이 되도록 정렬해보자
df2.sort_index(axis=0)
Out[131]:
In [132]:
# column을 기준으로?
df2.sort_index(axis=1)
Out[132]:
In [134]:
# 내림차순으로는?
df2.sort_index(axis=1, ascending=False)
Out[134]:
In [135]:
# 값 기준 정렬하기
# D열의 값이 오름차순이 되도록 정렬하기
df2.sort_values(by='D')
Out[135]:
In [136]:
# B열의 값이 내림차순이 되도록 정렬하기
df2.sort_values(by='B', ascending=False)
Out[136]:
In [138]:
df2["E"] = np.random.randint(0, 6, size=6)
df2["F"] = ["alpha", "beta", "gamma", "gamma", "alpha", "gamma"]
df2
Out[138]:
In [139]:
# E열과 F열을 동시에 고려하여, 오름차순으로 하려면?
df2.sort_values(by=['E','F'])
Out[139]:
In [140]:
# 지정한 행 또는 열에서 중복값을 제외한 유니크한 값만 얻기
df2['F'].unique()
Out[140]:
In [142]:
# 지정한 행 또는 열에서 값에 따른 개수 얻기
df2['F'].value_counts()
Out[142]:
In [144]:
# 지정한 행 또는 열에서 입력한 값이 있는지 확인하기
df2['F'].isin(['alpha','beta'])
# 아래와 같이 응용할 수 있다.
Out[144]:
In [146]:
# F열의 값이 alpha나 beta인 모든 행 구하기
df2.loc[df2['F'].isin(['alpha','beta']),:]
Out[146]:
In [149]:
df3 = pd.DataFrame(np.random.randn(4, 3), columns=["b", "d", "e"],
index=["Seoul", "Incheon", "Busan", "Daegu"])
df3
Out[149]:
In [150]:
func = lambda x: x.max() - x.min()
In [151]:
df3.apply(func, axis=0)
Out[151]:
Reference : http://doorbw.tistory.com/172 [Tigercow.Door]
지금까지 감자코딩에 감자개발자의 Pandas에 대한 정리였습니다. 감사합니다.
'AI' 카테고리의 다른 글
[CNN] Convolution Neural Network 1 (0) | 2018.10.04 |
---|---|
[머신러닝] 단어를 벡터화 하는 임베딩 방법론 (0) | 2018.08.11 |
[머신러닝] Anaconda2(아나콘다)/Jupyter Notebook(주피터) 환경구축 및 설치하기 (0) | 2018.08.08 |
[머신러닝 - Tensorflow] Lec-15 TensorFlow로 Fancy Softmax Classification의 구현하기 (new) (0) | 2018.03.18 |
[머신러닝 - Tensorflow]Lec14-TensorFlow로 Softmax Classification의 구현하기 (0) | 2018.03.18 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준알고리즘
- 코드엔진
- 프로그래밍
- BFS
- 학교
- node.js
- 복습
- TensorFlow
- Algorigm
- 노드
- 텐서플로우
- 개발하는 관광이
- 리버싱
- 알고리즘
- C언어
- Controller
- db
- Android
- C langauge
- MVC
- 감자코딩
- 머신러닝
- 스프링
- Spring
- 초보자를 위한 C언어 300제
- 감자개발자
- 안드로이드
- programming
- 백준
- node
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함