Pandas 활용한 데이터 분석 입문(3) - DataFrame 데이터 조회, 변경, 추가, 삭제, 데이터 파일 읽기

천호영·2021년 6월 22일
0

DataFrame - 데이터 조회, 변경

DataFrame 에 저장되어 있는 특정 열/행 데이터를 조회하여 값을 변경하는 방법에 대해 학습합니다.

DataFrame 의 열 데이터 조회

방법1) 인덱싱 기법 사용하기 : DataFrame[‘조회할 열의 인덱스명’]
방법2) . 연산자 사용하기 : DataFrame. 조회할 열의 인덱스명
두 방법 중 인덱싱 기법이 권장됩니다.

여러 열을 조회할 때는 .연산자는 불가능하고, 인덱싱 기법만 가능합니다.
이때 인덱스 값은 리스트 형태로 전달해야 합니다.

DataFrame 의 행 데이터 조회

행 데이터 조회를 위해 loc 프로퍼티를 사용 : DataFrame.loc[조회할 행의 인덱스]

행과 열의 인덱스를 모두 사용하여 조회

DataFrame.loc [‘조회할 행의 인덱스’, ‘조회할 열의 인덱스‘]

<실습코드>

import pandas as pd

# 실습 데이터 생성
score = {'name': ['Jessi', 'Emma', 'Alex', 'Jessi', 'Tom'],
         'score': [100, 95, 80, 85, 97],
         'grade': ['A', 'A', 'B', 'B', 'A'],
         'subject':['python', 'java', 'python', 'c', 'java']}
c = ['name', 'subject', 'score', 'grade', 'etc']

df = pd.DataFrame(data=score, columns=c)
print(df)


'''
인덱싱 기법과 . 연산자로 열 데이터 조회 실습
'''
print('\nColumns : name')
print(df['name'])

print('\nColumns : name')
print(df.name)


'''
df.name 의 타입 출력하여 확인
'''
print('\nType:', type(df.name))


'''
다중 열 데이터 조회 실습
'''
print('\nColumns : name-subject-grade')
print(df[['name','subject','grade']])


'''
etc 열 데이터 변경하기
'''
print('\nModify Column Data')
df['etc']= 0
print(df)


'''
loc 이용하여 행 데이터 조회 실습
'''
print('\nRows-1')
print(df.loc[1])


'''
loc 이용하여 다중 행 데이터 조회 실습
'''
print('\nRows-0,2,4')
print(df.loc[[0,2,4]])


'''
특정 행 데이터 변경 실습
'''
print('\nModify Rows0')
df.loc[0] = ['Jessi', 'java', 70, 'C', 1]
print(df)


'''
행과 열의 조건을 동시에 지정하여 조회 실습
'''
row_idx = [1,2,4]
col_idx = ['name', 'subject', 'grade']
print('\nRows & Columns')
print(df.loc[row_idx, col_idx])

<실행결과>

    name subject  score grade  etc
0  Jessi  python    100     A  NaN
1   Emma    java     95     A  NaN
2   Alex  python     80     B  NaN
3  Jessi       c     85     B  NaN
4    Tom    java     97     A  NaN

Columns : name
0    Jessi
1     Emma
2     Alex
3    Jessi
4      Tom
Name: name, dtype: object

Columns : name
0    Jessi
1     Emma
2     Alex
3    Jessi
4      Tom
Name: name, dtype: object

Type: <class 'pandas.core.series.Series'>

Columns : name-subject-grade
    name subject grade
0  Jessi  python     A
1   Emma    java     A
2   Alex  python     B
3  Jessi       c     B
4    Tom    java     A

Modify Column Data
    name subject  score grade  etc
0  Jessi  python    100     A    0
1   Emma    java     95     A    0
2   Alex  python     80     B    0
3  Jessi       c     85     B    0
4    Tom    java     97     A    0

Rows-1
name       Emma
subject    java
score        95
grade         A
etc           0
Name: 1, dtype: object

Rows-0,2,4
    name subject  score grade  etc
0  Jessi  python    100     A    0
2   Alex  python     80     B    0
4    Tom    java     97     A    0

Modify Rows0
    name subject  score grade  etc
0  Jessi    java     70     C    1
1   Emma    java     95     A    0
2   Alex  python     80     B    0
3  Jessi       c     85     B    0
4    Tom    java     97     A    0

Rows & Columns
   name subject grade
1  Emma    java     A
2  Alex  python     B
4   Tom    java     A

DataFrame - 데이터 추가, 삭제

DataFrame 에 데이터를 추가하거나 삭제하는 방법에 대해 학습합니다.

DataFrame 에 데이터 추가하기

df[‘new column’] = 열에 추가할 데이터셋
df.loc[‘new row’] = 행에 추가할 데이터 셋

DataFrame 의 데이터 삭제하기

df.drop(row_index) = 행 데이터 삭제
df.drop(columns=[col_index]) = 열 데이터 삭제

  • inplace=True 인자를 추가하면 원본 데이터의 변경이 발생함
  • 새로운 변수에 삭제 결과를 저장해서 사용하는 것을 권장함
    [예] new_obj = df.drop(0)

<실습코드>

import pandas as pd

# 실습 데이터 생성
score = {'name': ['Jessi', 'Emma', 'Alex', 'Jessi', 'Tom'],
         'score': [100, 95, 80, 85, 97],
         'grade': ['A', 'A', 'B', 'B', 'A'],
         'subject':['python', 'java', 'python', 'c', 'java']}
c = ['name', 'subject', 'score', 'grade', 'etc']

df = pd.DataFrame(data=score, columns=c)
print(df)


'''
Series 객체 생성하여 'semester' 라는 열 추가
'''
semester_data = pd.Series(['20-01', '20-01', '20-02', '20-01'])
df['semester'] = semester_data

print('\nAdd Columns : semester')
print(df)


'''
연산 이용하여 'high_score' 라는 열 추가
'''
df['high_score'] = df['score']>90

print('\nAdd Columns : high_score')
print(df)


'''
6 번 인덱스에 행 데이터 추가
'''
df.loc[6] = ['Jina', 'python', 100, 'A', 1, '20-02', True]

print('\nAdd Row 6')
print(df)

'''
1) drop() 이용하여 행 데이터 삭제
2) inplace 인자를 사용하여 원본 데이터에 바로 삭제
'''
df.drop(6, inplace=True)

print('\nDelete Row : 6')
print(df)


'''
drop() 이용하여 'etc' 열 삭제 (원본데이터변경)
'''
df.drop(columns=['etc'], inplace=True)

print('\nDelete Column :')
print(df)

<실행결과>

    name subject  score grade  etc
0  Jessi  python    100     A  NaN
1   Emma    java     95     A  NaN
2   Alex  python     80     B  NaN
3  Jessi       c     85     B  NaN
4    Tom    java     97     A  NaN

Add Columns : semester
    name subject  score grade  etc semester
0  Jessi  python    100     A  NaN    20-01
1   Emma    java     95     A  NaN    20-01
2   Alex  python     80     B  NaN    20-02
3  Jessi       c     85     B  NaN    20-01
4    Tom    java     97     A  NaN      NaN

Add Columns : high_score
    name subject  score grade  etc semester  high_score
0  Jessi  python    100     A  NaN    20-01        True
1   Emma    java     95     A  NaN    20-01        True
2   Alex  python     80     B  NaN    20-02       False
3  Jessi       c     85     B  NaN    20-01       False
4    Tom    java     97     A  NaN      NaN        True

Add Row 6
    name subject  score grade  etc semester  high_score
0  Jessi  python    100     A  NaN    20-01        True
1   Emma    java     95     A  NaN    20-01        True
2   Alex  python     80     B  NaN    20-02       False
3  Jessi       c     85     B  NaN    20-01       False
4    Tom    java     97     A  NaN      NaN        True
6   Jina  python    100     A    1    20-02        True

Delete Row : 6
    name subject  score grade  etc semester  high_score
0  Jessi  python    100     A  NaN    20-01        True
1   Emma    java     95     A  NaN    20-01        True
2   Alex  python     80     B  NaN    20-02       False
3  Jessi       c     85     B  NaN    20-01       False
4    Tom    java     97     A  NaN      NaN        True

Delete Column :
    name subject  score grade semester  high_score
0  Jessi  python    100     A    20-01        True
1   Emma    java     95     A    20-01        True
2   Alex  python     80     B    20-02       False
3  Jessi       c     85     B    20-01       False
4    Tom    java     97     A      NaN        True

데이터 파일 읽기

Pandas 는 다양한 포맷의 파일을 DataFrame 으로 읽을 수 있는 다양한 Reader/Writer 함수를 제공합니다.

Pandas 에서 지원하는 파일 포맷의 종류는 공식 사이트을 참고하세요.

pd.read_csv(filepath or url)
  • csv 포맷(,로 데이터구분)의 파일을 읽어 DataFrame 으로 변환하는 함수
  • filepath or url: 경로가 포함된 파일명 또는 파일이 저장된 서버의 URL
pd.read_excel(filepath or url)
  • excel 포맷의 파일을 읽어 DataFrame 으로 변환하는 함수
  • filepath or url: 경로가 포함된 파일명 또는 파일이 저장된 서버의 URL
pd.read_excel(filepath or url, header=None)
  • 엑셀 데이터에 별도의 컬럼이 존재하지 않는 경우, 첫 번째 데이터가 컬럼으로 자동 저장됨
  1. header=None으로 컬럼지정 안하고 DataFrame 생성
  2. 그리고 df.columns로 컬럼명 임의로 지정하기
pd.read_excel(filepath or url, header=n)
  • header에 정수형 인자 n을 입력하면, 몇 번째 행부터 읽을 것인지 지정할 수 있음.(ex. 컬럼이 여러 개인 경우)
pd.read_excel(filepath or url, sheet_name='sheet명')
  • 기본적으로 가장 첫 번째 sheet의 데이터를 읽어오는 함수

<실습코드>

import pandas as pd


'''
titanic_train.csv 파일을 읽어오세요.
'''
url = 'https://codepresso-online-platform-public.s3.ap-northeast-2.amazonaws.com/learning-resourse/titanic_train.csv'
titanic_df = pd.read_csv(url)
print(type(titanic_df))


'''
읽어온 데이터의 info 를 출력해보세요.
'''
print('\nSummary of DataFrame')
print(titanic_df.info())


'''
읽어온 데이터의 행 데이터 5개를 출력해보세요.
'''
print('\nReturn the first n rows')
print(titanic_df.head(5))


# students_score.xlsx 이 저장된 url
url = 'https://codepresso-online-platform-public.s3.ap-northeast-2.amazonaws.com/learning-resourse/python-data-analysis/students_score.xlsx'


'''
엑셀 파일에서 데이터 읽기
'''
print('\nRead students_score.xlsx')
sample_df = pd.read_excel(url)
print(sample_df)


'''
1) header=none 옵션으로 컬럼 없이 데이터 읽기
2) df.columns 에 새로운 컬럼명 저장하기
주석(#)을 지우고, 주어진 빈칸의 코드를 완성하세요.
'''
sample_df = pd.read_excel(url, header=2)
sample_df.columns = ['name', 'age', 'score', 'grade', 'subject']

print('\nRead Excel by header=none')
print(sample_df)


'''
'students' sheet 에 있는 데이터 읽기
주석(#)을 지우고, 주어진 빈칸의 코드를 완성하세요.
'''
print('\nRead Excel on students sheet')
student_df = pd.read_excel(url, sheet_name='students')
print(student_df)

<실행결과>

<class 'pandas.core.frame.DataFrame'>

Summary of DataFrame
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
None

Return the first n rows
  PassengerI    Survived      Pclass        Name         Sex         Age       SibSp       Parch      Ticket        Fare       Cabin    Embarked
           1           0           3Braund, Mr..        male        22.0           1           0   A/5 21171        7.25         nan           S
           2           1           1Cumings, M..      female        38.0           1           0    PC 17599     71.2833         C85           C
           3           1           3Heikkinen,..      female        26.0           0           0STON/O2. 3..       7.925         nan           S
           4           1           1Futrelle, ..      female        35.0           1           0      113803        53.1        C123           S
           5           0           3Allen, Mr...        male        35.0           0           0      373450        8.05         nan           S


Read students_score.xlsx
   Jessi  20  100  A  python
0   Emma  24   95  A    java
1   Alex  23   80  B  python
2  Jessi  20   85  B       c
3    Tom  27   97  A    java
4    Sia  28   79  C  python

Read Excel by header=none
    name  age  score grade subject
0  Jessi   20     85     B       c
1    Tom   27     97     A    java
2    Sia   28     79     C  python

Read Excel on students sheet
    name  age  etc1  etc2  etc3                email
0    Lee   25   0.1   0.1   0.1    lee@codepresso.kr
1  Hwang   24   0.1   0.1   0.1  hwang@codepresso.kr
2    Kim   28   0.1   0.1   0.1    kim@codepresso.kr
3   Choi   27   0.1   0.1   0.1   choi@codepresso.kr
4   Park   21   0.1   0.1   0.1   park@codepresso.kr
5    Lim   20   0.1   0.1   0.1    lim@codepresso.kr

0개의 댓글