10 Minutes to pandas
초보자를 위한 Pandas 소개
- 자세한 내용은’cookbook‘참조
- pandas 0.24.1 documentation
7. 병합
Concat
pandas는 Series, DataFrame 및 Panel 객체를 조인/병합 유형 작업의 경우 인덱스 및 관계 대수 기능에 대한 다양한 유형의 논리로 손쉽게 결합할 수 있는 다양한 기능을 제공합니다.
df=pd.DataFrame(np.random.randn(10,4))
df
#break it into pieces
pieces=[df[:3],df[3:7],df[7:]]
pd.concat(pieces)
Out[65]:
0 1 2 3
0 -0.936497 0.035785 -1.948344 -0.872485
1 -0.901573 -0.406977 0.282420 1.995679
2 0.350583 0.023508 -0.231986 -0.637906
3 0.614168 -0.807614 1.062147 0.174521
4 2.325358 0.375285 -0.004919 -0.772673
5 0.753493 0.153424 -1.026853 0.456579
6 -2.457705 -1.039590 -0.252836 -1.177802
7 -0.152389 3.716780 -0.278010 -1.362557
8 -0.073911 -1.453387 -2.222094 -1.114078
9 -0.786243 -0.570721 -0.835087 -0.736105
Out[65]:
0 1 2 3
0 -0.936497 0.035785 -1.948344 -0.872485
1 -0.901573 -0.406977 0.282420 1.995679
2 0.350583 0.023508 -0.231986 -0.637906
3 0.614168 -0.807614 1.062147 0.174521
4 2.325358 0.375285 -0.004919 -0.772673
5 0.753493 0.153424 -1.026853 0.456579
6 -2.457705 -1.039590 -0.252836 -1.177802
7 -0.152389 3.716780 -0.278010 -1.362557
8 -0.073911 -1.453387 -2.222094 -1.114078
9 -0.786243 -0.570721 -0.835087 -0.736105
결합
SQL 스타일 병합
left=pd.DataFrame({'key':['foo','foo'],'lval':[1,2]})
right=pd.DataFrame({'key':['foo','foo'],'rval':[4,5]})
left
right
pd.merge(left,right,on='key')
Out[66]:
key lval
0 foo 1
1 foo 2
Out[66]:
key rval
0 foo 4
1 foo 5
Out[66]:
key lval rval
0 foo 1 4
1 foo 1 5
2 foo 2 4
3 foo 2 5
다른 예시
left=pd.DataFrame({'key':['foo','bar'],'lval':[1,2]})
right=pd.DataFrame({'key':['foo','bar'],'rval':[4,5]})
left
right
pd.merge(left,right, on='key')
Out[67]:
key lval
0 foo 1
1 bar 2
Out[67]:
key rval
0 foo 4
1 bar 5
Out[67]:
key lval rval
0 foo 1 4
1 bar 2 5
추가
데이터프레임에 행 추가
df=pd.DataFrame(np.random.randn(8,4),columns=['A','B','C','D'])
df
s=df.iloc[3] #index '3'
df.append(s,ignore_index=True)
Out[73]:
A B C D
0 2.835013 1.367990 1.000113 0.033557
1 1.642647 0.735804 -1.374949 -0.451156
2 0.316412 -0.493159 0.956598 -0.695106
3 0.226823 -1.536158 0.818281 -0.871151
4 -2.216179 0.853335 -1.642484 -0.732483
5 -0.721202 0.678233 -0.973721 0.837790
6 -0.698786 0.762075 2.243878 0.473854
7 -0.365788 1.036647 -0.291522 -1.256139
Out[73]:
A B C D
0 2.835013 1.367990 1.000113 0.033557
1 1.642647 0.735804 -1.374949 -0.451156
2 0.316412 -0.493159 0.956598 -0.695106
3 0.226823 -1.536158 0.818281 -0.871151
4 -2.216179 0.853335 -1.642484 -0.732483
5 -0.721202 0.678233 -0.973721 0.837790
6 -0.698786 0.762075 2.243878 0.473854
7 -0.365788 1.036647 -0.291522 -1.256139
8 0.226823 -1.536158 0.818281 -0.871151
8. 그룹화
“그룹화”는 다음 단계 중 하나 이상의 프로세스를 포함하는 것을 말합니다.
- 몇 가지 기준에 따라 그룹으로 데이터 ‘분할’
- 독립적으로 각 그룹에 기능 ‘적용’
- 결과를 데이터 구조로 ‘결합’
df=pd.DataFrame({'A':['foo','bar','foo','bar','foo','bar','foo','foo'],
'B':['one','one','two','three','two','two','one','three'],
'C':np.random.randn(8),
'D':np.random.randn(8)})
df
Out[76]:
A B C D
0 foo one 2.241761 1.644150
1 bar one 1.481125 -0.138093
2 foo two 2.315399 -1.089430
3 bar three 0.494300 -0.910367
4 foo two -1.566179 0.645582
5 bar two 0.345112 -0.177249
6 foo one 0.427744 -1.611746
7 foo three -1.834687 1.673733
그룹화 한 다음 결과 그룹에 sum() 함수를 적용합니다.
df.groupby('A').sum()
Out[77]:
C D
A
bar 2.320536 -1.225709
foo 1.584038 1.262290
여러 열로 그룹화하면 계층적 인덱스가 형성되고 다시 sum함수를 적용할 수 있습니다.
df.groupby(['A','B']).sum()
Out[78]:
C D
A B
bar one 1.481125 -0.138093
three 0.494300 -0.910367
two 0.345112 -0.177249
foo one 2.669505 0.032404
three -1.834687 1.673733
two 0.749220 -0.443848
9. Reshaping
stack
tuples=list(zip(*[['bar','bar','baz','baz',
'foo','foo','qux','qux'],
['one','two','one','two',
'one','two','one','two']]))
index=pd.MultiIndex.from_tuples(tuples, names=['first','second'])
df=pd.DataFrame(np.random.randn(8,2),index=index, columns=['A','B'])
df2=df[:4]
df2
Out[81]:
A B
first second
bar one 0.640996 -2.115345
two -0.562975 -1.098557
baz one -0.799104 0.858243
two 1.120342 0.239564
stack()은 DataFrame의 열에 있는 레벨을 “압축”합니다.
stacked=df2.stack()
stacked
Out[82]:
first second
bar one A 0.640996
B -2.115345
two A -0.562975
B -1.098557
baz one A -0.799104
B 0.858243
two A 1.120342
B 0.239564
dtype: float64
“stacked” DataFrame이나 Series(MultiIndex를 가지고있는인덱스)인 경우, stack()의 반대 연산은 unstack()이며, 디폴트 값으로 마지막 레벨을 unstack 합니다.
stacked.unstack()
stacked.unstack(1)
stacked.unstack(0)
Out[83]:
A B
first second
bar one 0.640996 -2.115345
two -0.562975 -1.098557
baz one -0.799104 0.858243
two 1.120342 0.239564
Out[83]:
second one two
first
bar A 0.640996 -0.562975
B -2.115345 -1.098557
baz A -0.799104 1.120342
B 0.858243 0.239564
Out[83]:
first bar baz
second
one A 0.640996 -0.799104
B -2.115345 0.858243
two A -0.562975 1.120342
B -1.098557 0.239564
Pivot Tables
df=pd.DataFrame({'A':['one','one','two','three']*3,
'B':['A','B','C']*4,
'C':['foo','foo','foo','bar','bar','bar']*2,
'D':np.random.randn(12),
'E':np.random.randn(12)})
df
Out[85]:
A B C D E
0 one A foo -0.545239 0.601491
1 one B foo 1.635836 -0.058278
2 two C foo 0.266583 -0.664336
3 three A bar 0.533973 0.193423
4 one B bar 0.502112 0.070346
5 one C bar 0.948488 -1.854831
6 two A foo -2.469761 1.168192
7 three B foo -2.207726 1.249103
8 one C foo -0.498839 -1.149512
9 one A bar 1.058183 0.676254
10 two B bar -0.165524 0.295981
11 three C bar 1.268656 0.816636
pd.pivot_table(df,values=['D','E'],index=['A','B'],columns=['C'])
Out[90]:
D E
C bar foo bar foo
A B
one A 1.058183 -0.545239 0.676254 0.601491
B 0.502112 1.635836 0.070346 -0.058278
C 0.948488 -0.498839 -1.854831 -1.149512
three A 0.533973 NaN 0.193423 NaN
B NaN -2.207726 NaN 1.249103
C 1.268656 NaN 0.816636 NaN
two A NaN -2.469761 NaN 1.168192
B -0.165524 NaN 0.295981 NaN
C NaN 0.266583 NaN -0.664336
10. 시계열
pandas는 빈도 전환(예시: 초단위 데이터에서 5분 데이터로 바꾸는 경우) 중에 리샘플링 동작을 수행하기 위한 간단하고도 강력한, 효율적인 기능을 갖는다. 이는 금융에서 많이 볼 수 있다. 하지만 그 외에도 여러 곳에서 시계열이 쓰인다.
rng=pd.date_range('1/1/2012',periods=100,freq='S') #freq=빈도, 's'=seconds
ts=pd.Series(np.random.randint(0,500,len(rng)),index=rng)
ts.resample('5Min').sum()
Out[99]:
2012-01-01 26154
Freq: 5T, dtype: int32
Comments