sort_index

2018/02/25 - [빅데이터 관련 프로그래밍/Python] - 15. Matplotlib 사용하기 –라인 플롯, 바 플롯, 히스토그램, 산점도

먼저 아래 데이터를 복붙하여 사용할 것이다. 리스트[]를 여러개 묶어놓은 2차원리스트 즉, array 데이터이다.
이 데이터를 DataFrame에 넣고, 칼럼과 인덱스를 주자. (Series 는 index만 인자로 줄 수 있었다)

data = [[1.4, np.nan],
           [7.1, -4.5],
        [np.nan, np.nan],
        [0.75, -1.3]]
df = pd.DataFrame(data, columns=["one", "two"], index=["a", "b", "c", "d"])

image


DataFrame의 데이터 분석용 통계함수 사용( sum, mean, min)

  • 이 때, sum()함수에 axis=0을 줘서 행 방향 = 의 합을 구할 수 있다. 마찬가지로 axis=1을 인자로 주면, 열 방향 = 의 합을 구할 수 있다.
    image
    이 때, sum()함수의 계산과정에서 NaN은 무시하고 계산하는 것을 알 수 있다.
  • 비슷하게, 특정 열에 대한 합과 특정 행의 합도 구할 수 있다. 인덱싱을 사용하면 된다.
    image
  • 비슷하게, 합 뿐만 아니라 평균( .mean()함수 ), 분산( .var()함수 )를 사용하면 된다.(인덱싱 없이하면 열에 대한 통계량이 나온다)
    image
  • 만약, 의 평균을 구하려면, sum()처럼 인자에 axis=1을 넣으면 되는데, NaN을 감안해서 무시안하고 평균도 NaN으로 처리하고 싶다면,
    또다른 인자로서 skipna = False를 대입하면 된다.  df.mean(axis=1, skipna=False)
    image
  • 그외 통계함수 정리
    image


  • 다시 df의 데이터를 보면서, “one”이라는 열의 NaN에는 열의 나머지성분의 평균값으로, “two”라는 열의 NaN에는 열의 나머지성분 중 최소값으로 대체해보자각 평균값과 최소값을 구한 뒤  - >  각 열에 .fillna( value = )를 대입해주면 된다.
    (1) 먼저 “one”열에서 평균값을 미리 계산해서 one_mean 에  담아둔다.( 통계함수들은 NaN을 배제하고 계산되기 때문에 바로 할 수 있다)
       one_mean = df["one"].mean()
    (2) “two”열에서 최소값을 .min() 를 이용해서 찾아서 two_min에 담아둔다.
       two_min = df["two"].min()
    (3) 각 열을 인덱싱한 것에 .fillna( value = )에다가 각각 넣은 뒤, 그 값을 다시 각 열에 대입한다.
        df["one"] = df["one"].fillna( value = one_mean )
         df["two"] = df["two"].fillna( value = two_min)
    image


DataFrame의 유용한 특수 통계함수 – 상관관계와 공분산

먼저 데이터는 아래와 같은 것을 복붙해서 사용하자. numpy의 rand함수를 이용해서 6x4 이차원 array를 만들고 대입한다.

df2 = pd.DataFrame(np.random.randn(6, 4),
                   columns=["A", "B", "C", "D"],
                   index=pd.date_range("20160701", periods=6))

image

  • 상관계수를 구하려면, df2[“특정열”]  .corr ( df2[ “비교하고싶은 열” ] ) 의 방식으로 .corr()함수를 사용한다.
    앞 변수에는 기준 열을 적고, 인자 비교하고 싶은 열을 인덱싱해서 넣어주면 된다.
    df2["A"].corr( df2["B"])
    이 때, 계산은 피어슨 상관계수 공식에 의해 계산된다.
    (cf. 피어슨 상관계수(Pearson correlation coefficient) 는 두 변수간의 관련성을 구하기 위해 보편적으로 이용된다 )
    ( 링크 : https://ko.wikipedia.org/wiki/%EC%83%81%EA%B4%80%EB%B6%84%EC%84%9D)
    image

  • 공분산을 구하려면, 상관계수와 비슷한데, .cov()함수를 사용하면 된다.
    df2["B"].cov( df2["C"])
    image
  • 만약, 특정 열을 인덱싱안하고, df2.corr() 이나, df2.cov()를 사용하면 모든 열 간의 상관관계와 공분산을 계산해준다.
    image


DataFrame 정렬함수

  • pandas의 DataFrame에서는 인덱스 기준 정렬과 값 기준 정렬을 지원한다.
    정렬 하기에 앞서, 기존의 인덱스칼럼순서를 섞어주기 위해 reindex()함수를 사용한다.
    dates = df2.index
    random_dates = np.random.permutation(dates)

    df2 = df2.reindex(index=random_dates, columns=["D", "B", "C", "A"])
    (1) datatime타입의 인덱스를 dates 변수에 넣고 –> np.random.permutation( ) 함수를 이용해서 섞어준 것을 random_dates에 넣는다.
        이 함수는 인자에 있는 리스트를 랜덤하게 섞어주는 역할을 한다
    (2) df2.reindex() 를 이용해서 기존 dataFrame에 인덱스와 칼럼을 섞어준다.
      - index는 datetime타입이라서 변수에 따로 빼내어 함수를 이용해서 섞고 난뒤 대입 / columns은 그냥 자체적으로 섞어서 대입해준다.
    image


index 기준 정렬

  • 인덱스가 오름차순이 되도록 해보자. df2.sort_index(axis=0)함수를 이용하는데, 인자로, axis = 0을 넣어서
    인덱스를 기준으로 0 = 열 = 행 방향(↓)으로 정렬해준다.
    image
  • 칼럼(열)이 오름차순으로 정렬하고 싶다면, 마찬가지로 sort_index()함수를 사용하는데, axis = 1을 넣어서
    칼럼을 기준으로 1= 행 = 열방향(→)으로 정렬해준다.
    image
  • 이제 내림차순으로 정렬하고 싶다면, index와 columns를 정렬하는 것과 똑같이 sort_index( axis = )에다가 , 추가로 인자를 ascending = False 를 주면,
    내림차순으로 정렬이 된다.
    먼저, 행 index를 내림차순으로 해보자. df2.sort_index(axis=0, ascending = False)
    image
    다음으로 열 columns를 내림차순으로 해보자. df2.sort_index(axis=1, ascending = False)
    image
    < 열 방향 = 행 = axis = 1> < 행 방향 = 열 = axis = 0>

값 기준 정렬 ( 거의 특정열에 대한 값들의 정렬임)

값 기준 정렬을 사용하는 것은  먼저 <특정 열>에 대해서  --> 그 값들이 오름차순으로 정렬되도록 –> 각 행들을 정렬해버리는 것이다.

  • 예를 들어,  <D열>기준으로 값들이 오름차순 되도록 행들을 정렬하는 코드는 df2.sort_values(by="D")이다.
    즉, sort_values( )함수의 인자에 by="열(칼럼) 이름”을 넣어주는 것이다. 
    sort_values( by = “ 칼럼명 ”)
    image

df2 의 E열과 F열을 추가해보자.
df2["E"] = np.random.randint(0,6, size = 6)
df2["F"] = ["alpha", "beta", "gamma", "gamma", "alpha", "gamma"]
( np.random.randint()는 정수를 랜덤하게 생성하는데, 인자의 0,6 은 0과 6사이(1,2,3,4,5)의 수 중 랜덤정수, 만약 최대값이 명시 되지 않으면 0<->최소값 사이 정수 / size는 리스트의 성분개수인 열  or  (행,렬) 을 의미한다)
image

  • 2개의 열에 대해서 오름차순하도록 할 수 있다. 즉,  첫번째 열을 기준으로 오름차순 하는데, 만약 값이 같다면 두번째 열을 기준으로 오름차순 되도록 할 수 있다. 방식은 sort_values( by = “칼럼명”)과 비슷한데, by = 에다가 리스트 형식으로 우선순위 대로 열들을 대입해준다.
    df2.sort_values(by=["E", "F"]) 는  E열을 기준으로 값들을 오름차순이 되도록 행을 정렬하는데, 만약 같다면, F열이 오름차순이 된다.
    (1개 열의 값기준 오름차순 정렬은 대괄호가 없이 그냥 by="칼럼명")
    image

그외 유용한 함수들

  • 특정열인덱싱 . unique() : 특정열을 중복없는 열로 만들어준다.
    특정열인덱싱 . value_counts() : 특정열의 각 성분값들이 포함된 행의 개수를 알려준다.
    특정열인덱싱 . isin(  [ “ 특정값 " ]  ) : 특정값이 포함되어있는지 boolean 마스크를 생성해준다.
                                                 이 때,  “특정값1”, “특정값2” 로 OR(또는) 연산이 가능하다.
    image
  • .isin( [ “”] )함수를 이용해 만든 마스크를  행을 선택(인덱싱)할 때 쓰는, df2.loc()함수의 행index에 집어넣으면,  해당 행을 뽑아낼 수 있다.
    df2.loc[ df2["F"].isin(["alpha", "beta"]) , :]
    위 코드는 특정열 “F”열에, alpha 혹은 beta를 포함하는 들을 뽑아낸다.
    image


사용자 정의 함수를 행or열에 적용하기 [  lambda  ->  apply() ]

새로운 DataFrame을 정의해서 사용하자. numpy의 randn함수로 2차원 array를 정의하고, 각 인덱스와 칼럼값을 직접 입력한다.

df3 = pd.DataFrame(np.random.randn(4, 3), columns=["b", "d", "e"],
                   index=["Seoul", "Incheon", "Busan", "Daegu"])

image

  1. 먼저, python에서 사용하는, 함수를 만들어주는 [ lambda 인자(, 인자2) : 표현식 ]으로  func라는 함수를 정의해보자.
    func함수는 사용자 정의 함수로서, 최대값- 최소값을 계산해서 반환해준다.
    func = lambda x: x.max() - x.min()
  2. 다음으로 행 또는 열에 대해서, apply()함수를 사용하여, 정의한 함수를 인자로 주고,  다음  axis을 인자로 주어 행 또는 열을 선택하면,
    정의한 함수가 해당 행 또는 열에 대해 계산을 해준다.
    df3.apply( func, axis = 0)  :  func함수를 axis=0인 행 방향(열)으로 시행해서, 각 열의 최대값 – 열의 최소값을 계산해 줄 것이다.
    image
    마찬가지로 axis = 1을 주면, 각 행들에 대해서 최대값 –최소값의 계산을 해줄 것이다.
    image
  1. 임월드 2019.06.12 11:01 신고

    안녕하세요 질문 하나만 드려요 될까요? def함수를 공부하고 있는데요 원리나 파이썬 자체로 이해는 하겠는데 데이터프레임이랑 함께 응용하려니까 갑자기 어렵네요 ㅠ
    제가 알고 싶은 것은 특정 열에 해당하는 value값을 인자로 넣었을 때 그 value에 해당하는 데이터프레임 자체를 나오게 하고 싶은 함수를 만드는 것입니다. 예들들어 사용자 데이터가 있다고 하면 사용자 이메일을 인자로 넣으면 그 이메일 사용자에 따른 데이터전체를 보는 것입니다. 판다스 색인기능으로 가능하긴 한데 함수로 해보고 싶습니다

+ Recent posts