Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

Python Pandas

Python Pandas

Pandas란?


  • Python Data Analysis Library의 약어로 데이터 분석을 하기 위해서 사용되는 필수 Package
  • Dataframe 개념 효율적으로 관리를 위함
  • Numpy, Pyarrow Library가 기반이 된다.
  • 같은 Int type이라도 여러 개 존재 ( Int64 , int64 , int32 .. ) - 참고
1
2
$ pip install pandas
$ pip install pyarrow

Dataframe

pd.Dataframe

  • 다양한 Datatype을 이용하여 Row,Col 형태로 표현
  • 개념적으로는 Series들을 하나의 Column으로 취급한 Set

    1
    2
    
      # Df to dict
      pd.DataFrame(d.items())
    
Dtype

  • df.astype
    • Dataframe type 변경 - Dictionary,Column을 통해
  • pd.to_numeric
    • float64로 변경
  • pd.to_datetime
    • datetime 변경
    1
    2
    
      import pandas as pd
      df = pd.DataFrame(flatten_data)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
      #https://stackoverflow.com/questions/21287624/convert-pandas-column-containing-nans-to-dtype-int
      pandas에서 Null값도 처리하여 주고 싶다면 Int64 사용
      df['col'] = df['col'].astype('col')
        
      # Dtype Object -> Float64
      # pandas version < 0.17
      # https://stackoverflow.com/questions/28277137/how-to-convert-datatypeobject-to-float64-in-python
      df = df.convert_objects(convert_numeric=True)
      # pandas version >= 0.17
      df["col"] = pd.to_numeric(df["col"])
        
      # Dtype Unix-> Datetime
      # https://stackoverflow.com/questions/19231871/convert-unix-time-to-readable-date-in-pandas-dataframe
      df[key] = pd.to_datetime(df[key], unit='ms', origin='unix')
        
      # Dtype String->boolean
      # https://stackoverflow.com/questions/17702272/convert-pandas-series-containing-string-to-boolean
      d = {'Delivered': True, 'Undelivered': False}
      df['col'].map(d)
        
      # 문자열처리 방식cnt
      df[key]=df[key].replace({'nan':None})
    
map

  • column data mapping
Column

  • drop
    • column
      1
      2
      3
      4
      5
      6
      
        df.drop(columns = ['A'])  # 한 개 열을 삭제할 때.
        df.drop(columns = ['A','B'])  #여러개 열을 삭제할 때.
              
        # columns를 안쓰고 axis 설정을 통해 삭제도 가능하다
        df.drop('A', axis = 1)   #한 개 열을 삭제할 때.
        df.drop(['A', 'B'], axis = 1)   #여러개 열을 삭제할 때.
      
    • row
      1
      2
      
        df.drop(0)  # index 중 0 행 삭제, axis의 default값이 axis = 0이기 때문에 안쳐도 된다.
        df.drop([1,2]) # 여러 행 삭제 - 1, 2 행을 삭제했다. 0과 3행만 남음
      
  • slicing
    • loc
      • 칼럼 Labeling 방식
      • df.loc[ row index value , col index value ]
      • To select rows - 참고
      1
      2
      3
      4
      5
      6
      
        # To select rows whose column value equals a scalar
        df.loc[df['column_name'] == some_value]
        # To select rows whose column value is in an iterable
        df.loc[df['column_name'].isin(some_values)]
        # Combine multiple conditions with &
        df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]
      
      • Appending column totals - 참고
      1
      2
      
        df['Total'] = df.sum(axis=1)
        df.loc['Total']= df.sum()
      
      1
      2
      3
      4
      5
      
        df.loc[:,'B':]  # B열부터 끝까지 출력
        df.loc[:,'A':'B'] # A열부터 B열까지 출력
              
        df.loc[1:] # 1행부터 끝까지 출력
        df.loc[2:3] # 2행부터 3행까지 출력
      
    • iloc
      • 숫자 index로만 접근이 가능
      • df.iloc[ row index value , col index value]
      1
      2
      3
      4
      5
      6
      7
      
        # delete column
        df.iloc[:, 1:] # 0번째 column을 삭제하고 나머지만 남긴다.
        df.iloc[:,2:] # 0번째, 1번째 column 삭제 뒤 나머지만 남기기.
              
        df.iloc[1:] # 0번째 행 삭제하고 나머지 추출
        df.iloc[1:3]  # 1번째 행부터 2번째 행까지만 출력하여 0행과 3행을 삭제한다.
        df[1:]    # row는 일반 슬라이싱이 defalut로 설정되어있어, iloc 없이도 index 슬라이싱으로 바로 삭제 가능하다.
      
index

  • rename
    • index
    1
    2
    
      # index 재설정
      df.index = ['new_idx1', 'new_idx2']
    
    • columns
      • difference
        • 해당 칼럼들을 제외하고 Dataframe을 추출한다.
        • A,B,C,D,E 칼럼이 있을 때 df[df.columns.difference(['B', 'C', 'D', 'E'])] A 칼럼만 추출하여 보여준다.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      
        df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC'))
        df
        Out:
           A  B  C
        0  1  2  3
        1  4  5  6
              
        df.rename( index={1:'a'} )
        Out: 
           B  C
        A      
        a  2  3
        4  5  6
              
        df1.rename(columns={'B': 'BB'})
        Out: 
           BB  C
        A       
        1   2  3
        4   5  6
      
  • set_index
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC'))
      df
      Out: 
          A  B  C
      0  1  2  3
      1  4  5  6
        
      df = df.set_index('A')
      df
      Out: 
          B  C
      A      
      1  2  3
      4  5  6
    
  • reset_index
    • index 값을 풀어주어 Column 값으로
    1
    
      df_user_inflow.groupby(['generated_date', 'datatype']).agg({'cnt': "sum"}).reset_index()
    
  • stack
    • column → index 추가, index level up
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
      import pandas as pd
      df = pd.DataFrame({'col_1':[1,2]},index=['one','two'])
      >
      col_1
      one      1
      two      2
        
      stack = df.stack()
        
      stack.index
      > multiindex
      one  col_1    1
      two  col_1    2
    
  • unstack
    • index → column 추가, index level down
    • level 을 지정하여 지정된 index 처리 가능 - df.unstack(level=0)
    • 여러 index를 지정하고 싶으면 param list - df.unstack(['index_name1','index_name2'])
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
      df = pd.DataFrame({'col_1':[1,2],'col_2':[3,4]},index=['one','two'])
      stack = df.copy().stack()
      >
      one  col_1    1
           col_2    3
      two  col_1    2
           col_2    4
        
      unstack = stack.unstack()
      >
      col_1  col_2
      one      1      3
      two      2      4
    
Apply

1
2
3
```python
df[’A’].apply(func)
```
assign

  • add column

    1
    2
    3
    4
    
      # add column
      # https://stackoverflow.com/questions/12555323/how-to-add-a-new-column-to-an-existing-dataframe
      length = df.shape[0]
      df.assign({column_name}=pd.Series([{value}]*length))
    
Group By

  • 집계연산과 함께 쓰는 경우 - sum,count,max,mean,min
  • multi column group by - list
1
2
3
4
5
6
7
8
# 단일인 경우
df.groupby(groupcol)[계산하고싶은col].집계함수()
# 다중인 경우
df.groupby([col1,col2]).agg({cal_col:집계함수,cal_col:집계함수})

df_user_inflow.groupby(['name', 'class']).sum()

df_user_inflow.groupby(['generated_date', 'datatype']).agg({'cnt': "sum"}).reset_index()
  • 분기별 표현
    • change to datetime
    • change PeriodIndex
    • 참고

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
        			date  quarter
         s1  3/22/13       2013q1
         s2  3/24/13       2013q1
         s1  6/21/13       2013q2
         s2  6/26/13       2013q2
         s1  9/21/13       2013q3
         s2  9/28/13       2013q3
              
        df.date = pd.to_datetime(df.date)
        df['quarter'] = pd.PeriodIndex(df.date, freq='Q')
      
Sort_values

  • 정렬할 칼럼 값
  • ascending = [False,True … ]
  • False 오름 차순
1
df.sort_values(['dt','type','variable'],ascending=[True,True,False])