In [2]:
import pandas as pd
import numpy as np
from bokeh.colors.named import greenyellow
데이터세트 결합하기: 병합과 조인¶
In [11]:
df1 = pd.DataFrame({'name' : ['kim', 'han', 'min'],
'group' : ['badminton', 'us', 'us']
})
df2 = pd.DataFrame({'name' : ['kim', 'han', 'min'],
'height' : ['192', '176', '160']
})
print(df1);print(df2, '\n')
df3 = pd.merge(df1, df2)
df3
name group 0 kim badminton 1 han us 2 min us name height 0 kim 192 1 han 176 2 min 160
Out[11]:
name | group | height | |
---|---|---|---|
0 | kim | badminton | 192 |
1 | han | us | 176 |
2 | min | us | 160 |
In [13]:
# 다대일 조인
df4 = pd.DataFrame({'group' : ['badminton', 'us'],
'age' : ['20', '21']
})
print(df3);print(df4, '\n')
# age열이 입력값에 따라 하나 이상의 위치에 반복해서 등장한다
pd.merge(df3, df4)
name group height 0 kim badminton 192 1 han us 176 2 min us 160 group age 0 badminton 20 1 us 21
Out[13]:
name | group | height | age | |
---|---|---|---|---|
0 | kim | badminton | 192 | 20 |
1 | han | us | 176 | 21 |
2 | min | us | 160 | 21 |
병합 키 지정¶
In [15]:
# 열 이름이나 열 이름의 리스트를 취하는 on 키워드를 사용해 키 열의 이름을 명시적으로 지정한다
print(df1);print(df2,'\n')
print(pd.merge(df1, df2, on='name'))
name group 0 kim badminton 1 han us 2 min us name height 0 kim 192 1 han 176 2 min 160 name group height 0 kim badminton 192 1 han us 176 2 min us 160
In [32]:
# 다른 열 이름을 가진 두 데이터세트를 병합할때
# 열 이름은 다르지만 안에 내용은 같아야함.
df3 = pd.DataFrame({'employee' : ['kim', 'han', 'min'],
'price' : [2000,3000,4000]
})
print(df1);print(df3,'\n')
pd.merge(df1, df3, left_on="name", right_on="employee")
name group 0 kim badminton 1 han us 2 min us employee price 0 kim 2000 1 han 3000 2 min 4000
Out[32]:
name | group | employee | price | |
---|---|---|---|---|
0 | kim | badminton | kim | 2000 |
1 | han | us | han | 3000 |
2 | min | us | min | 4000 |
조인을 위한 집한 연산 지정하기¶
In [39]:
df6 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'],
'food': ['fish', 'beans', 'bread']},
columns=['name', 'food'])
df7 = pd.DataFrame({'name': ['Mary', 'Joseph'],
'drink': ['wine', 'beer']},
columns=['name', 'drink'])
print(df6);print(df7,'\n')
name food 0 Peter fish 1 Paul beans 2 Mary bread name drink 0 Mary wine 1 Joseph beer
In [40]:
print(pd.merge(df6, df7), '\n')
# how 키워드를 사용해 명시적으로 지정할 수 있다
print(pd.merge(df6, df7, how='outer'), '\n')
print(pd.merge(df6, df7, how='left'), '\n')
name food drink 0 Mary bread wine name food drink 0 Joseph NaN beer 1 Mary bread wine 2 Paul beans NaN 3 Peter fish NaN name food drink 0 Peter fish NaN 1 Paul beans NaN 2 Mary bread wine
열 이름이 겹치는 경우: suffixes 키워드¶
In [46]:
df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
'rank': [1, 2, 3, 4]})
df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],
'rank': [3, 1, 4, 2]})
print(df8);print(df9,'\n')
print(pd.merge(df8, df9, on='name'), '\n')
# suffixes 키워드를 사용해 접미사를 별도로 지정할 수 있다
print(pd.merge(df8, df9, on='name', suffixes=["_one", "_two"]), '\n')
name rank 0 Bob 1 1 Jake 2 2 Lisa 3 3 Sue 4 name rank 0 Bob 3 1 Jake 1 2 Lisa 4 3 Sue 2 name rank_x rank_y 0 Bob 1 3 1 Jake 2 1 2 Lisa 3 4 3 Sue 4 2 name rank_one rank_two 0 Bob 1 3 1 Jake 2 1 2 Lisa 3 4 3 Sue 4 2
집계와 분류¶
행성 데이터¶
In [47]:
import seaborn as sns
In [51]:
planets = sns.load_dataset('planets')
print(planets.shape, '\n')
print(planets.head())
(1035, 6) method number orbital_period mass distance year 0 Radial Velocity 1 269.300 7.10 77.40 2006 1 Radial Velocity 1 874.774 2.21 56.95 2008 2 Radial Velocity 1 763.000 2.60 19.84 2011 3 Radial Velocity 1 326.030 19.40 110.62 2007 4 Radial Velocity 1 516.220 10.50 119.47 2009
Pandas의 간단한 집계 연산¶
- count() : 항목 전체 개수
- first(), last() : 첫 항목과 마지막 항목
- mean(), median() : 평균값과 중앙 값
- min(), max() : 최솟값과 최댓값
- std(), var() : 표준편차와 분산
- mad() : 절대 평균 편차
- prod() : 전체 항목의 곲
- sum() : 전체 항목의 합
In [52]:
planets.dropna().describe()
Out[52]:
number | orbital_period | mass | distance | year | |
---|---|---|---|---|---|
count | 498.00000 | 498.000000 | 498.000000 | 498.000000 | 498.000000 |
mean | 1.73494 | 835.778671 | 2.509320 | 52.068213 | 2007.377510 |
std | 1.17572 | 1469.128259 | 3.636274 | 46.596041 | 4.167284 |
min | 1.00000 | 1.328300 | 0.003600 | 1.350000 | 1989.000000 |
25% | 1.00000 | 38.272250 | 0.212500 | 24.497500 | 2005.000000 |
50% | 1.00000 | 357.000000 | 1.245000 | 39.940000 | 2009.000000 |
75% | 2.00000 | 999.600000 | 2.867500 | 59.332500 | 2011.000000 |
max | 6.00000 | 17337.500000 | 25.000000 | 354.000000 | 2014.000000 |
GroupBy: 분할, 적용, 결합¶
In [53]:
df = pd.DataFrame({'key' : ['A', 'B', 'C', 'A', 'B', 'C'],
'data' : range(6)}, columns=['key', 'data'])
df
Out[53]:
key | data | |
---|---|---|
0 | A | 0 |
1 | B | 1 |
2 | C | 2 |
3 | A | 3 |
4 | B | 4 |
5 | C | 5 |
In [54]:
df.groupby('key')
Out[54]:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x16ca129c0>
In [55]:
df.groupby('key').sum()
Out[55]:
data | |
---|---|
key | |
A | 3 |
B | 5 |
C | 7 |
In [60]:
# 열 인덱싱
print(planets.groupby('method'))
print(planets.groupby('method')['orbital_period'])
print(planets.groupby('method')['orbital_period'].median())
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x16ce595b0> <pandas.core.groupby.generic.SeriesGroupBy object at 0x16d1f2600> method Astrometry 631.180000 Eclipse Timing Variations 4343.500000 Imaging 27500.000000 Microlensing 3300.000000 Orbital Brightness Modulation 0.342887 Pulsar Timing 66.541900 Pulsation Timing Variations 1170.000000 Radial Velocity 360.200000 Transit 5.714932 Transit Timing Variations 57.011000 Name: orbital_period, dtype: float64
In [65]:
# 그룹 내 반복
for (method, group) in planets.groupby('method'):
print("{0:30s} shape={1}".format(method, group.shape))
Astrometry shape=(2, 6) Eclipse Timing Variations shape=(9, 6) Imaging shape=(38, 6) Microlensing shape=(23, 6) Orbital Brightness Modulation shape=(3, 6) Pulsar Timing shape=(5, 6) Pulsation Timing Variations shape=(1, 6) Radial Velocity shape=(553, 6) Transit shape=(397, 6) Transit Timing Variations shape=(4, 6)
In [67]:
# 디스패치 메서드
# 디스패치 메서드는 각 개별 그룹에 적용되고 그 결과는 GroupBy 내에서 결합돼 반환된다
planets.groupby('method')['year'].describe().unstack()
Out[67]:
method count Astrometry 2.0 Eclipse Timing Variations 9.0 Imaging 38.0 Microlensing 23.0 Orbital Brightness Modulation 3.0 ... max Pulsar Timing 2011.0 Pulsation Timing Variations 2007.0 Radial Velocity 2014.0 Transit 2014.0 Transit Timing Variations 2014.0 Length: 80, dtype: float64
In [ ]:
'Data science > 데이터 기초,시각화' 카테고리의 다른 글
Pandas 기초(4) (0) | 2024.09.15 |
---|---|
Pandas 기초(3) (0) | 2024.09.15 |
Pandas 기초(1) (0) | 2024.09.11 |
NumPy 기초(3) (0) | 2024.09.01 |
NumPy 기초(2) (0) | 2024.09.01 |