ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] Index 활용 / data 입출력 / 연산
    NAN/Python 2021. 7. 3. 15:59
    728x90

    Index 활용


    행/열 추가

     

    #dataframe 생성
    
    test_data = {'이름':['상우','현정','문영','동엽','우제'],
                 '국어':[85,88,90,50,70],
                 '수학':[57,90,100,78,66],
                 '영어':[85,89,67,98,98],
                 '과학':[50,78,98,50,69],
                 '체육':[94,80,99,69,100]}
    df = pd.DataFrame(test_data)
    
    # 새로운 열 생성하기
    
    df['체육'] = 90
    df['사회'] = [90,60,77,43,42]
    print(df)
    
    print()
    
    # 새로운 행 생성하기
    
    df.loc[5] = 100
    df.loc[6] = ['다니엘',90,91,50,33,80,90]
    df.loc['일곱'] = ['마크',77,48,78,96,11,54]
    print(df)
    
    #새로운 열 생성
    
       이름  국어   수학  영어  과학  체육  사회
    0  상우  85   57  85  50  90  90
    1  현정  88   90  89  78  90  60
    2  문영  90  100  67  98  90  77
    3  동엽  50   78  98  50  90  43
    4  우제  70   66  98  69  90  42
    
    # 새로운 행 생성
    
         이름   국어   수학   영어   과학   체육   사회
    0    상우   85   57   85   50   90   90
    1    현정   88   90   89   78   90   60
    2    문영   90  100   67   98   90   77
    3    동엽   50   78   98   50   90   43
    4    우제   70   66   98   69   90   42
    5   100  100  100  100  100  100  100
    6   다니엘   90   91   50   33   80   90
    일곱   마크   77   48   78   96   11   54

     

    코드를 천천히 읽어보면 데이터에 행/열을 어떻게 추가할 수 있는지 패턴을 알 수 있다.

     


    임의 데이터로 정렬하기

     

    Reshaping Data

     

    # dataframe 생성
    
    test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'],
                 '사과' : [1000, 900, 1200, 500, 800],
                 '배' : [1100, 900, 1000, 1100, 2000],
                 '딸기' : [800, 900, 600, 900, 1200],
                 '포도' : [1500, 900, 1000, 800, 900]}
    
    df = pd.DataFrame(test_data)
    df
    
    상호명	사과	배	딸기	포도
    0	상우네	1000	1100	800	1500
    1	현정이네	900	900	900	900
    2	문영이네	1200	1000	600	1000
    3	동엽이네	500	1100	900	800
    4	우제네	800	2000	1200	900
    
    new_df1 = df.set_index(['상호명'])
    new_df1
    
    new_df2 = df.set_index(['사과'])
    new_df2
    
    
    상호명	배	딸기	포도
    사과				
    1000	상우네	1100	800	1500
    900	현정이네	900	900	900
    1200	문영이네	1000	600	1000
    500	동엽이네	1100	900	800
    800	우제네	2000	1200	900

     

    기존 데이터에서 가지고 있는 열 column을 index로 지정하여 사용한다. 이와 같은 방법을 사용하면 column이 row index

     

    적용되어 새로운 DataFrame이 생성되어 반환되기 때문에, 만약 원본 데이터에 변경 값을 적용하고 싶다면

     

    df.set_index('column', inplace=True) 와 같은 방법으로 적용할 수 있다.

     

     

    reindex( )

     

     

    기존 DataFrame에 존재하지 않는 column을 row index로 사용하고자 할 때 쓰이는 메서드로,

     

    존재하지 않는 row index가 추가될 경우 해당 row의 value 는 NaN(Not a Number 잘 못 입력)을 띄우게 되는데

     

    데이터를 특정 값으로 채우고자 한다면 fill_value 옵션을 사용해야한다.

     

    # dataframe 생성
    
    test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'],
                 '사과' : [1000, 900, 1200, 500, 800],
                 '배' : [1100, 900, 1000, 1100, 2000],
                 '딸기' : [800, 900, 600, 900, 1200],
                 '포도' : [1500, 900, 1000, 800, 900]}
    
    #row 인덱스를 무작위로 선정
    
    df = pd.DataFrame(test_data, index=[4,2,1,0,3])
    df
    
    	상호명	사과	배	딸기	포도
    4	상우네	1000	1100	800	1500
    2	현정이네	900	900	900	900
    1	문영이네	1200	1000	600	1000
    0	동엽이네	500	1100	900	800
    3	우제네	800	2000	1200	900
    
    # reindex를 사용해 새로운 DataFrame 생성
    
    new_index = [0,1,2,3,4,5]
    
    reindex_df1 = df.reindex(new_index)
    
    reindex_df1
    
    	상호명	사과	배	딸기	포도
    0	동엽이네	500.0	1100.0	900.0	800.0
    1	문영이네	1200.0	1000.0	600.0	1000.0
    2	현정이네	900.0	900.0	900.0	900.0
    3	우제네	800.0	2000.0	1200.0	900.0
    4	상우네	1000.0	1100.0	800.0	1500.0
    5	NaN	NaN	NaN	NaN	NaN

     

    # fill_value로 NaN데이터 채우기
    
    reindex_df2 = df.reindex(new_index, fill_value = 123)
    reindex_df2
    
    	상호명	사과	배	딸기	포도
    0	동엽이네	500	1100	900	800
    1	문영이네	1200	1000	600	1000
    2	현정이네	900	900	900	900
    3	우제네	800	2000	1200	900
    4	상우네	1000	1100	800	1500
    5	123	123	123	123	123

     


     

    reset_index( )

     

    set_index를 통해 만들어진 row index를 초기화할 때 사용된다.

     

    reindex_df2.reset_index
    reindex_df2
    
    
    상호명	사과	배	딸기	포도
    0	동엽이네	500	1100	900	800
    1	문영이네	1200	1000	600	1000
    2	현정이네	900	900	900	900
    3	우제네	800	2000	1200	900
    4	상우네	1000	1100	800	1500
    5	123	123	123	123	123

     


    데이터 순차 정렬

     

    sort_index( )

     

    무작위로 선정된 row index를 오름 차순 혹은 내림 차순으로 정렬해 주는 기능을 한다.

     

    ascending=True, 이 값이 True 이면 오름 차순, False면 내림 차순으로 진행

     

    # dataframe 생성
    
    test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'],
                 '사과' : [1000, 900, 1200, 500, 800],
                 '배' : [1100, 900, 1000, 1100, 2000],
                 '딸기' : [800, 900, 600, 900, 1200],
                 '포도' : [1500, 900, 1000, 800, 900]}
    
    #row 인덱스를 무작위로 선정
    
    df = pd.DataFrame(test_data, index=[4,2,1,0,3])
    
    # 오름 차순 정렬
    df.sort_index(ascending=True)
    
    	상호명	사과	배	딸기	포도
    0	동엽이네	500	1100	900	800
    1	문영이네	1200	1000	600	1000
    2	현정이네	900	900	900	900
    3	우제네	800	2000	1200	900
    4	상우네	1000	1100	800	1500

     

     

    sort_values( )

     

     

    values 값으로도 오름 차순, 내림 차순을 결정할 수 있다.

     

    # dataframe 생성
    
    test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'],
                 '사과' : [1000, 900, 1200, 500, 800],
                 '배' : [1100, 900, 1000, 1100, 2000],
                 '딸기' : [800, 900, 600, 900, 1200],
                 '포도' : [1500, 900, 1000, 800, 900]}
    
    # sort_value를 통해 오르 내림 차순
    
    df = pd.DataFrame(test_data)
    
    apple_ascending = df.sort_values('포도',ascending=True)
    apple_ascending
    
    	상호명	사과	배	딸기	포도
    3	동엽이네	500	1100	900	800
    1	현정이네	900	900	900	900
    4	우제네	800	2000	1200	900
    2	문영이네	1200	1000	600	1000
    0	상우네	1000	1100	800	1500

     

     

    데이터 삭제

     

    drop( )

     

    # dataframe 생성
    
    test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'],
                 '사과' : [1000, 900, 1200, 500, 800],
                 '배' : [1100, 900, 1000, 1100, 2000],
                 '딸기' : [800, 900, 600, 900, 1200],
                 '포도' : [1500, 900, 1000, 800, 900]}
    
    df = pd.DataFrame(test_data)
    new_df1 = df.set_index(['상호명'])
    
    # 데이터 삭제하기
    
    ndf2 = df.drop(['사과','딸기'],axis=1)
    ndf2
    
    	상호명	배	포도
    0	상우네	1100	1500
    1	현정이네	900	900
    2	문영이네	1000	1000
    3	동엽이네	1100	800
    4	우제네	2000	900

     

    이처럼 drop을 사용하여 column을 제거할 수 있는데 주의할 점은 axis를 통해 축을 반드시 지정해주어야 한다.

     

    ndf3 = df.drop([0,4])
    ndf3
    
    	상호명	사과	배	딸기	포도
    1	현정이네	900	900	900	900
    2	문영이네	1200	1000	600	1000
    3	동엽이네	500	1100	900	800

     

    row 삭제는 비교적 간단하게 정수형 위치 index 혹은 지정한 index로 삭제할 수 있다,

     

    만약 삭제, 추가 등 모든 기록을 포함한 데이터를 남기고 싶다면 inplace를 통해 원본에 저장하자

     


    Pandas Data 입출력

     

     

    CSV 파일 읽기 / 저장

    읽기 read_csv( )
    df = pd.read_csv( ' 파일 이름. csv')

    저장 to_csv( )
    df.to_csv( './ 파일 이름. csv')

     

    JSON 파일 읽기 / 저장

    읽기 read_json( )
    df = pd.read_json( ' 파일 이름. json ')

    저장 to_json( )
    df.to_json( '. / 파일 이름. josn ')

     


    Pandas 연산

     

     

    Data Frame과 사칙 연산을 하게 되면 Data Frame의 각 원소와 숫자가 하나하나 연산되어 반환된다.

     

    예시에는 나눗셈만 연산되어 나왔지만 다른 연산도 가능하다.

     

    dict_data = {'c0' : [1,2,3], 'c1' : [4,5,6],
                 'c2' : [7,8,9], 'c3' : [10,11,12], 'c4' : [13,14,15]}
    
    df = pd.DataFrame(dict_data)
    
    add = df + 10
    add
    
    sub = df - 10
    sub
    
    mul = df * 10
    mul
    
    div = df / 10
    div
    
    c0	c1	c2	c3	c4
    0	0.1	0.4	0.7	1.0	1.3
    1	0.2	0.5	0.8	1.1	1.4
    2	0.3	0.6	0.9	1.2	1.5
    

     

     

    Data Frame & Data Frame

     

    Data Frame끼리 연산을 하게 되면 같은 위치에 있는 원소끼리 계산하여,

     

    새로운 반환 값으로 Data Frame을 생성하게 된다. 만약 원소의 개 수가 일치하지 않을 경우 NaN으로 표기된다.

     

    dict_data = {'c0' : [1,2,3], 'c1' : [4,5,6],
                 'c2' : [7,8,9], 'c3' : [10,11,12], 'c4' : [13,14,15]}
    
    dict_data1 = {'c0' : [1,2,3], 'c1' : [4,5,6],
                 'c2' : [7,8,9], 'c3' : [10,11,12], 'c4' : [13,14,15]}
    
    
    df = pd.DataFrame(dict_data)
    df1 = pd.DataFrame(dict_data1)
    
    df * df1
    
    	c0	c1	c2	c3	c4
    0	1	16	49	100	169
    1	4	25	64	121	196
    2	9	36	81	144	225

     

     


     

    통계 메서드 알아보기

     

     

    from random import *
    
    # 난수 생성
    data1 = []
    data2 = []
    for i in range(0,10):
      data1.append(uniform(0,1))
    for i in range(0,10):
      data2.append(uniform(0,2))  
    
    # 데이터 프레임 생성
    dict_data = {'first':data1,
                 'second':data2}
    index_data = {'zero','1st','2nd','3rd','4th','5th','6th','7th','8th','9th'}             
    df = pd.DataFrame(dict_data, index= index_data)
    
    #평균값
    
    mean_val = df.mean()
    
    #first 평균
    first_mean = df['first'].mean()
    #second 평균
    second_mean = df['second'].mean()
    
    print(mean_val)
    print()
    print(f'first 평균 : {first_mean}')
    print(f'second 평균 : {second_mean}')
    
    first     0.593488
    second    1.545130
    dtype: float64
    
    first 평균 : 0.5934881824450425
    second 평균 : 1.5451299685587607
    #중앙값
    
    median_val = df.median()
    
    #first 중앙
    first_median = df['first'].median()
    #second 중앙
    second_median = df['second'].median()
    
    print(median_val)
    print()
    print(f'first 중앙 : {first_median}')
    print(f'second 중앙 : {second_median}')
    
    first     0.625385
    second    1.536886
    dtype: float64
    
    first 중앙 : 0.6253845527935137
    second 중앙 : 1.536885946049231
    # 최댓값
    
    max_val = df.max()
    
    #first 최대값
    first_max = df['first'].max()
    #second 최대값
    second_max = df['second'].max()
    
    print(max_val)
    print()
    print(f'first 최대값 : {first_max}')
    print(f'second 최대값 : {second_max}')
    
    first     0.948949
    second    1.887554
    dtype: float64
    
    first 중앙 : 0.9489493550940792
    second 중앙 : 1.887553869277309
    # 최소값
    
    min_val = df.min()
    
    #first 최소
    first_min = df['first'].min()
    #second 최소
    second_min = df['second'].min()
    
    print(min_val)
    print()
    print(f'first 최소 : {first_min}')
    print(f'second 최소 : {second_min}')
    
    first     0.245787
    second    1.204534
    dtype: float64
    
    first 중앙 : 0.24578660623413828
    second 중앙 : 1.2045344012730197
    # 표준편차
    
    std_val = df.std()
    
    #first 표준편차
    first_std = df['first'].std()
    #second 표준편차
    second_std = df['second'].std()
    
    print(std_val)
    print()
    print(f'first 표준편차 : {first_std}')
    print(f'second 표준편차 : {second_std}')
    
    first     0.253994
    second    0.180444
    dtype: float64
    
    first 표준편차 : 0.2539938802224056
    second 표준편차 : 0.18044385743988223
    #상관계수
    
    ndf.corr()

     

     


     

Designed by Tistory.