In [0]:
df = pd.DataFrame({
'c_id' : [ 'c1','c1','c1', 'c2','c2','c2', 'c3','c3','c3' ],
'p_id' : [ 'p1','p2','p3', 'p1','p2','p3', 'p1','p2','p3' ],
'amount' : [ 20, 10, 0, 30, 20, 30, 0, 5, 10 ]
})
df
Out[0]:
In [0]:
df.info()
In [0]:
#df.pivot(행 인덱스 , 열 이름 , 각 셀에 들어갈 값)
df.pivot( index = 'c_id', columns = 'p_id', values = 'amount')
Out[0]:
In [0]:
#df.pivot(행 인덱스 , 열 이름 , 각 셀에 들어갈 값)
df.pivot_table( index = 'c_id', columns = 'p_id', values = 'amount')
Out[0]:
In [0]:
## 피봇 테이블의 경우 집계함수 사용이 가능하다.
df.pivot_table( index = 'c_id', columns = 'p_id', values = 'amount', aggfunc = np.sum)
Out[0]:
In [0]:
df = pd.DataFrame({
'c_id' : [ 'c1','c1','c1', 'c2','c2','c2', 'c3','c3','c3' ],
'p_id' : [ 'p1','p2','p3', 'p1','p2','p3', 'p1','p2','p3' ],
'amount' : [ 20, 10, 0, 30, 20, 30, 0, 5, 10 ],
'reg' : [ 'S','S','S','S','S','S','A','A','A' ]
})
df
Out[0]:
In [0]:
#인덱스를 두개로 하고자 하는 경우, c_id
df.pivot_table( index = ['c_id', 'reg'], columns = 'p_id', values = 'amount', aggfunc = np.sum)
Out[0]:
In [0]:
## 행 인덱스가 reg인경우 두개 밖에 없으므로 amount에 mean() 함수가 적용 된다. 즉 S - p1에 해당하는 값이 두개가 있을때 그 평균이 들어간다.
df.pivot_table( index = ['reg'], columns = 'p_id', values = 'amount')
Out[0]:
In [0]:
## 기본으로 mean 함수가 적용된다.
df.pivot_table( index = ['reg'], columns = 'p_id', values = 'amount', aggfunc = np.mean)
Out[0]:
In [0]:
## 모든 함수가 전부 사용가능 한다.
df.pivot_table( index = ['reg'], columns = 'p_id', values = 'amount', aggfunc = np.sum)
Out[0]:
In [0]:
df1 = df_csv.copy()
In [0]:
df2 = df_csv.copy()
In [0]:
df3 = df_csv.copy()
In [0]:
df1
Out[0]:
In [0]:
df2
Out[0]:
In [0]:
df3
Out[0]:
In [0]:
row_concat = pd.concat([df1, df2, df3]) # ignore_index = True
In [0]:
row_concat
Out[0]:
In [0]:
# row_concat의 4번째 행을 추출 하고자 한다.
# ix는 행 인덱스의 이름을 줄수도 있고 , 행 번호를 줄 수도 있다.
# loc와 iloc를 사용할것. 행 번호로 접근하고자 할때 iloc, 이름으로 접근할때 loc
row_concat.iloc[3, ]
row_concat.iloc[4, ]
row_concat.loc [3, ]
Out[0]:
In [0]:
# df1에 시리즈 연결 ( 행 방향으로 연결 xsis = 0 )
new_row_serise = pd.Series( [ 'n1', 'n2', 'n3', 'n4' ] )
Out[0]:
In [0]:
# 아지막 열인 D 오른쪽에다가 시리즈를 붙이고 싶다.
pd.concat( [df1, new_row_serise])
Out[0]:
In [0]:
pd.concat( [df1, new_row_serise], axis = 1)
Out[0]:
In [0]:
## 행 한개로 추가하고 싶을때, 시리즈가 아닌 데이터 프레임이어야 제대로 들어간다.
new_row_df = pd.DataFrame( [[ 'n1', 'n2', 'n3', 'n4' ]],
columns = [ 'A', 'B', 'C', 'D'] )
In [0]:
pd.concat( [df1, new_row_df], axis = 0)
Out[0]:
In [0]:
#연결 하고자 하는 데이터 프레임이 한개일 경우 append를 사용할 수 도 있다.
df1.append(new_row_df)
Out[0]:
In [0]:
# 딕셔너리 형태의 자료형을 행에 추가하는법.
data_dict = {'A': 'n2', 'B':'n2','C':'n3','D':'n4'}
In [0]:
## 어펜드 하려면 시리즈가 이름을 가지고 있거나 ignore_index = True를 주면 된다.
df1.append(data_dict, ignore_index = True)
Out[0]:
In [0]:
rci = pd.concat([df1, df2, df3], ignore_index = True) # ignore_index = True
In [0]:
# 가로로 붙히기.
pd.concat([df1, df2, df3], ignore_index = True, axis = 1)
Out[0]:
In [0]:
# 특정 열만 합치기
col_concat = pd.concat([df1, df2, df3], axis = 1)
col_concat
col_concat['A']
Out[0]:
In [0]:
#계층적인 구조(멀티 인덱스)를 만들때 사용하는 클래스.
mi = pd.MultiIndex.from_tuples( [ ('c1', '2019'), ('c1', '2020'),
('c2', '2019'), ('c2', '2020') ])
mi
Out[0]:
In [0]:
pd.DataFrame( np.arange(16).reshape(4,4))
Out[0]:
In [0]:
#해당 데이터 프레임을 계층적 행 인덱스로 줄 수 있다.
df = pd.DataFrame( np.arange(16).reshape(4,4), index = mi , columns = [ 'p1', 'p2', 'p3', 'p4'])
In [0]:
df.stack()
Out[0]:
In [0]:
## 결과가 시리즈로 나온다.
ds = df.stack()
In [0]:
type(ds)
Out[0]:
In [0]:
ds.index
Out[0]:
In [0]:
## 스택을 하고 난 이후에 계층 단위로 df에 접근이 가능하다.
ds['c1']
Out[0]:
In [0]:
ds['c1']['2020']
Out[0]:
In [0]:
ds['c1']['2020'][ ['p2', 'p3']]
Out[0]:
In [0]:
#만일 데이터에 결측값이 포함되어 있다면 , 결측값을 빼고 스택을 할지 아니면 그냥 할지 옵션으로 결정 가능
df.ix['c2','p4'] = None
In [0]:
df
Out[0]:
In [0]:
## 기본적으로 NaN은 제외시킨후 스택시킨다.( dropna = True )
df.stack()
Out[0]:
In [0]:
# Nan도 확인 하고자 할때는
df.stack(dropna = True)
Out[0]:
In [0]:
## Unstack : stack되있는 구조를 다시 해제한다.
ds
Out[0]:
In [0]:
ds.unstack()
Out[0]:
In [0]:
# level = -1 이게 디폴트 0으로 주게 되면 c1, c2가 사라진다.
ds.unstack( level = 0 )
Out[0]:
In [0]:
# 컬럼과 행 인덱스가 바뀌었다.
ds.unstack( level = 1 )
Out[0]:
In [0]:
# melt = > 특정 컬럼의 이름이 데이터로 들어간다.
df = DataFrame({ 'cid' : ['c1', 'c1', 'c2', 'c2'],
'pcd' : ['p1', 'p2', 'p1', 'p2'],
'cid' : [1,2,3,4],
'pamt' : [10,20,30,40]
})
df
Out[0]:
In [0]:
# 기존의 컬럼 이름은 날아갔다.열 이름이 variable로 들어간다.
pd.melt(df, id_vars = [ 'cid', 'pcd'], var_name = 'pname', value_name = 'vname' )
Out[0]:
In [0]:
## 기존의 데이터 프레임에서 피처 4개를 전부다 녹이지 않고 pcnt 와 pamt를 녹이고싶다.
## 특정 컬럼만 녹이기 ,
pd.melt(id_vars = [['cid','pcd'] ], var_name = 'pname')
In [0]:
## 크로스 테이블 => 재구조화
df = DataFrame({ 'id' : [ 'id1','id1','id1','id2','id2','id3' ],
'd1' :[ 'a','a','a','b','b','b' ],
'd2' :[ 'b','b','b','c','c','d' ]
})
df
Out[0]:
In [0]:
#d1이 행 인덱스 열인덱스는 d2에있는 cd , 행과열이 만나는 건수가 몇건이 있느냐를 알기 위해서
# 2, 2 a행 ,c 열에는 몇건이 있는지가 들어간다.
pd.crosstab( index = df.d1, columns = df.d2)
Out[0]:
In [0]:
#a와 b가 저장 되어있는d1이 행으로 , d2가 열로, 기존의 데이터 프레임에서 a와 b가 세건 a와 c가 0 건 a와 d가 0 건
# id1에 d1이 a인게 3개 , b인게 0 개 이런식으로 요소의 갯수를 세고자 할때 사용.
pd.crosstab( df.id, columns = df.d1)
Out[0]:
'딥러닝 모델 설계 > Machine Learning' 카테고리의 다른 글
Day 5. Sort_String_Binomial_Distribution (0) | 2019.07.08 |
---|---|
Day 4. Grouping, sorting, visualizing (0) | 2019.07.06 |
Day 4. binomializing [ OneHotEncoding ] (0) | 2019.07.06 |
Day 03. Scaler (0) | 2019.07.03 |
Day 03. Replacement (0) | 2019.07.03 |