모플로 2021. 7. 25. 17:41
반응형

Pandas Data handling

  • 실제 DB의 데이터를 가져오게 된다면 전처리를 필요로함

group by


( 출처: boostcamp ai pre course )


# data from: 
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
         'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
         'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
         'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
         'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}

df = pd.DataFrame(ipl_data)

df.groupby("Team")["Points"].sum()
->
Team
Devils    1536
Kings     2285
Riders    3049
Royals    1505
kings      812
Name: Points, dtype: int64
  • hierarchical index
    • 두개의 컬럼으로 group by를 할 경우 index가 2개생성
h_index = df.groupby(["Team", "Year"])["Points"].sum()
h_index

->
Team    Year
Devils  2014    863
        2015    673
Kings   2014    741
        2016    756
        2017    788
Riders  2014    876
        2015    789
        2016    694
        2017    690
Royals  2014    701
        2015    804
kings   2015    812
Name: Points, dtype: int64
  • hierarchical index unstack
    • 다시 테이블로 만들어줌
h_index.unstack()

->
Year    2014    2015    2016    2017
Team                
Devils    863.0    673.0    NaN    NaN
Kings    741.0    NaN    756.0    788.0
Riders    876.0    789.0    694.0    690.0
Royals    701.0    804.0    NaN    NaN
kings    NaN    812.0    NaN    NaN
  • swaplevel
    • index level을 변경
h_index.swaplevel()
->
Year  Team  
2014  Devils    863
2015  Devils    673
2014  Kings     741
2016  Kings     756
2017  Kings     788
2014  Riders    876
2015  Riders    789
2016  Riders    694
2017  Riders    690
2014  Royals    701
2015  Royals    804
      kings     812
  • hierachical index operation
    • index level을 기준으로 기본 연산 수행 가능
h_index.sum(level=1)
->
Year
2014    3181
2015    3078
2016    1450
2017    1478
Name: Points, dtype: int64
  • filter
    • 특정 조건으로 데이터를 검색할 때
    • filter 안에는 boolean 조건이 존재해야함
      # len(x)는 grouped된 dataframe의 개수
      df.groupby("Team").filter(lambda x: len(x)>=3)

merge & concat

  • sql에서 사용하는 merge와 같음
  • 두개의 데이터를 하나로 합침
  • RDB 데이터로 되어있기 때문에 필요
# 외래키가 subject_id 
#innerjoin
pd.merge(df_a,df_b, on="subject_id")

# left join, right join, outer(full join), inner join
pd.merge(df_a, df_b, on="subject_id", how="left")
반응형