DataFrame을 생성해보자.

  • Series도 있지만, 주로 사용할 데이터는 DataFrame이다. 필요한 패키지들을 import해놓고, 아래와 같이
    python 딕셔너리를 만들고, DataFrame을 만드는데, 인자로 columns를 주어 키값=칼럼=열 의 순서를 정해주고, 딕셔너리에 없는 새로운 열도 추가해주자. 그리고 index를 인자로주어 리스트의성분=행=인덱스의 이름도 정해주자.
    data = {"name" : [ "Kilho", "Kilho","Kilho", "Charles","Charles" ],
               "year" : [2014, 2015, 2016, 2015, 2016],
               "points" : [1.5, 1.7, 3.6, 2.4, 2.9]}
    df = pd.DataFrame( data, columns = ["year", "names", "points", "penalty"],
                                       index = ["one", "two", "threes", "four", "five"]  )
    image


DataFrame의 열을 선택(인덱싱)하고 조작하기

  • 하나의 열을 가져오는 방법은 2가지이다. 편한것을 선택하면 된다.  대표적인 열 선택 코드는  DataFrame변수[ “ 칼럼명” ] 이다.
    이 때, DataFrame에서 하나의열을 가져온 결과는 Series의 모양을 하고 있다는 것을 기억하자.
    ( series를 생성할 때,  index명도 함께 줄 수 있다는 점을 뒤에 사용할 것이다)
    df[“컬럼이름”] or df.컬럼이름 으로 하나의 컬럼(열)을 series의 형태로 가져올 수 있다.
    image
  • 2개 이상의 열을 가져오는 방법은, df[[ “칼럼이름1”, “칼럼이름2”]]의 방법으로 가져온다. 이 때는, series가 아닌 dataFrame형태로 가져온다.
    대괄호가 2개라는 것을 명심하자. 대괄호 1개에다가 [리스트]형식으로 가져온다고 생각해도 된다.
    image
  • 선택된 열의 모든 성분에, 일괄적으로 값을 대입할 수 있다. 성분이 비어있던 “penalty”에다가 0.5를 대입해보자.
    image
  • 일관적인 값이 아니라, 선택된 열에다가  행에 따라  각각 어떤 값을 대입하고 싶다면, python의 리스트 형태로 만들어서 대입하면 된다.
    numpy의 1차원 array도 대입할 수 있다.
    image
  • 새로운 열을 생성과 동시에 대입할 수도 있다. zeros라는 열을 새로 만들고, 여기다가 numpy의 np.arange(5)로 대입해보자. 새로운 열(칼럼)이 추가되면서, 값이 대입되는 것을 확인할 수 있다.
    cf) np.arange(n)은  0부터 총 n개, 즉, n-1까지 1차원 배열을 생성한다는 뜻이다.
    image
  • DataFrame의 하나의 열을 선택했을 때 Series로 제공된다는 점에서 착안하여, 새로운 열을 입력할 때도, 리스트가 아닌 series를 대입해줄 수 도 있다.
    series를 정의한 다음, 그 series 변수를 df[ “ 칼럼이름” ]  = series를 대입해보자.
    series를 만들어서 대입하는 이유는, series를 정의할 때, 리스트형식으로 values를 넣고, 뒤 인자에 index를 정해줄 수 있고, 기존의 행index와 동일한 이름으로 주면, 맞춰서 끼워들어가는 특징을 이용할 수 있다. 5개의 index이름 중에 3개만 골라서 , 거기 끼워맞춰 들어가게 해보자.
    image
    열에 값을 대입할 때, python의 리스트나 numpy의 array를 대입했던 것과 달리, Series를 대입할 때의 핵심적인 차이다.
    ***근데,, 원래 기존값이 있는 상태에서, 값이 없는 행에 끼워넣었더니,, 기존값들이 NaN이 되어버린다. 끼워넣기보다는 초기화..!
  • 새로운 열을 추가할 때, 기존dataFrame 열의값을 연산한 것도 대입할 수 있다.(그냥 대입하면 그대로 옮겨온 것과 같다)
    새로운 열 “net_points”를 만들면서 동시에 연산한 값을 대입해보자
    image
    비슷하게 조건문을 통해 True 혹은 False가 대입되도록 할 수도 있다.
    image
  • 기존의 열을 삭제하는 방법은, del 키워드와 함께 일반적인 열 선택코드를 입력하면 된다.
    예를 들어 del df[“high_points”]
    image
  • 현재 존재하는 컬럼들을 확인하려면 df.columns로 트래킹 하면된다.
    image
  • 데이터프레임의 index와 columns에 이름을 정해주자.
    image


DataFrame의 행을 선택하고 조작하기

  • 경고 ) pandas에서는 행을 선택하는 인덱싱 방법이 무수히 많다는 것이 문제이다. 그리고 버젼이 올라가면서 행을 인덱싱하는 방법도 달라지고 있다.
  • 먼저 열을 인덱싱하는 것과 유사한 행 인덱싱 방법 2가지를 살펴보자.
    df[ 0 : 3 ]은 index 0부터 총 3개 행을 가져온다. numpy의 array와 비슷하다.
    df[ “two” : “four” ]는 index명이 “two”인것부터 마지막 “four”까지 사이의 모든 행을 가져온다.

    image
    마치 열을 선택하는 코드와 너무나도 유사하기 때문에, 비추는 방법들이다.
  • .loc[] .iloc[]의 함수를 사용해서 행을 인덱싱하는 방법을 추천한다.
    df.loc [ “ index 명” ] 을 통해 가져온 값은, 열을 인덱싱 했을 때와 마찬가지로 Series의 형태로 가져온다.
    행의 범위인덱싱도 마찬가지다
    image
  • 행을 인덱싱하는 .loc[]함수의 재밌는 점은, 행을 인덱싱하면서 동시에 열도 인덱싱할 수 있따.
    인덱스 인자로서 “칼럼명”을 추가해주면 된다. ex> df.loc[ “two”:”four” , “points”]
    image
    이를 응용하면, 행인덱스 자리에 전체를 의미하는 콜론(:)을 넣고, 가져올 칼럼명을 입력하면, 열을 인덱싱하는 것과 같아진다.
    즉,  .loc[ : , “칼럼명” ] 으로 열을 선택하는 인덱싱하는 코드인  df [ “칼럼명” ]과 같다.
    image
    마찬가지로, 2개이상의 열을 선택하는 방법에서 2개의 대괄호로, 리스트형식처럼 칼럼명을 나열해서 가져왔던 것과 유사하게, .loc함수에서도 할 수 있다.
    image
    . loc[]함수를 이용해서  행과 열에 동시에 범위 인덱싱도 할 수 있다.
    my) loc[ ] 함수를 이용한 인덱싱은, 행을 우선순위로하여서 무조건 입력되어야하며, 뒤에 인자를 추가해서 칼럼명 자유롭게 인덱싱할 수 있는 것이구나.
    image
  • 새로운 행을 추가하는 방법도 열과 마찬가지로 인덱싱할 때처럼, 일반적인 행을 선택하는 방식에 대입해주는 식이다.
    대신 열(칼럼)에 값을 대입해주기 위해서는, 전체 열을 인덱싱한 콜론을 넣은 뒤, 우항에서 리스트의 형식으로 대입해주는 것이다
    (칼럼의 갯수에 맞게 리스트 성분을 대입한다면, 굳이 열에 대한 전체인덱싱은 없어도 가능하더라)
    image
    *** .loc[ , ]만 기억하면 모든 인덱싱이 가능하다.
  • .iloc 함수는 numpy 의 array 인덱싱 방식으로 가져올 때 쓰는 것이다. 즉, 칼럼명이 아니라 index숫자로서 가져올 때 쓴다.
    예를 들어, df.iloc[3]은 4번째 행을 가져온다. array인덱싱과 유사하다.
    image
    마찬가지로 행과 열의 범위인덱싱을 할 수 있다.
    df.iloc[ 3:5, 0:2 ] 는 4번째 행부터 5번째 행까지,  1번째열 부터 2번째 열까지를 가져온다.
    image
    간격을 띄엄띄엄 으로 행과 열을 가지고 오고 싶다면,  리스트형식으로 해당 index를 준다.
    예를 들어, df.iloc[ [0, 1, 3] , [1, 2] ]  1번째 2번째 4번째 행 / 2번째, 3번째 열을 가져오게 된다.
    image
    특정 값 하나만 가져오고 싶다면 범위인덱스가 아닌 해당 인덱스를 적어주면 된다.
    df.iloc[1, 2] 는 2행 3열의 값만 가져온다.
    image
  • 즉, iloc를 이용하면 마치 numpy의 array를 인덱싱 하는 것처럼 index번호로 인덱싱 할 수 있다.



Boolean 인덱싱하기

  • 기존 DataFrame에서,  “year”칼럼 중 2014보다 큰 값만 인덱싱하고 싶다고 가정해보자.
    df["year"] > 2014 를 입력하면, Series형태로 마스크가 얻어진다.
    image
       (마스크는  전체데이터중 기준이 되는 열 과 그 가운데 특정성분을 비교한 조건문이었다.
       for문으로 선택된 행을 뽑아내고 싶을 땐, 중복없는 전체기준열을 따로 담아서, 조건문에 하나씩 들어가도록 사용했었다)
  • 이러한 마스크를 인덱스 자리에 넣은 .loc함수를 이용하면 원하는 행을 선택할 수 있다. (열은 전체를 선택한다.)
    df.loc[ df["year"] > 2014 , : ]
    image
  • 이번에는 names 칼럼중에, 이름이 Kilho인 행을 뽑아내고, 칼럼은 names와 같이 points도 뽑아내보자.
    df.loc[ df["names"] == "Kilho", ["names","points"]]
    image
    ( 이렇게 전체기준열(칼럼) 에서 원하는 행을 뽑아냈으면, 전체기준열(칼럼)도 같이 가져오는게 일반적인 분석방법이다)
  • 만약 사용할 조건이 여러개라면, & 앤드 연산자를 이용해서, 여러개의 마스크 행 인덱스에 넣어주면 된다.
    df.loc [ ( df["points"] > 2 ) & (df["points"] < 3 ) , : ] 는  [ points칼럼의 값이 2보다 크고 3보다 작은 행들 , 의 모든 컬럼정보를 ] 가져온다.
    image
  • 이제 조건에 맞게 마스크를 사용해서 인덱싱 한 행의  특정칼럼에 특정값을 입력할 수 있다
    df.loc [ df["points"] > 3, "penalty"] = 0 를 통해  points칼럼이 3보다 큰 행들을 뽑아내서 , penalty칼럼에 0을 대입한다.
    image

+ Recent posts