본문 바로가기

프로그래밍/파이썬

판다스(Pandas) 사용하기

데이터 프레임 만들기

import pandas as pd

# 데이터 프레임 생성
df = pd.DataFrame()

# 열 추가
df['Name'] = ['Jacky', 'Steven']
df['Age'] = [28, 23]
df['Driver'] = [True, Flase]

# 데이터프레임 출력
print(dataframe)

#결과
     Name  Age  Driver
0   Jacky   28    True
1  Steven   23   False

# 열 생성
new_person = pd.Series(['Molly', 40, True], index = ['Name', 'Age', 'Driver'])

# 열 추가
df = df.append(new_person, ignore_index=True)
# 출력
print(df)

# 결과
     Name  Age  Driver
0   Jacky   28    True
1  Steven   23   False
2   Molly   40    True

# 넘파이 배열로 데이터프레임 만들기
import numpy as np

data = [['jacky', 38, True], ['Steven', 25, False]]

matrix = np.array(data)
df2 = pd.DataFrame(matrix, columns=['Name', 'Age', 'Driver'])

#출력
print(df2)

#결과
     Name Age Driver
0   jacky  38   True
1  Steven  25  False

# 원본 리스트 전달하여 데이터프레임 생성
df3 = df.DataFrame(data, columns=['Name', 'Age', 'Driver']

#출력
print(df3)

#결과
     Name Age Driver
0   jacky  38   True
1  Steven  25  False

데이터프레임 차원 확인하기

# 데이터 프레임 차원 확인
print(df.shape)

#결과
(3, 3)

# 데이터프레임 통계값 확인하기

#dataframe.describe()

 

데이터프레임 탐색하기

import pandas as pd

# 데이터 url
url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

# 데이터 적재
df = pd.read_csv(url)
print(df.iloc[0])
#결과
Name        Allen, Miss Elisabeth Walton
PClass                               1st
Age                                 29.0
Sex                               female
Survived                               1
SexCode                                1

print(df.iloc[1:4])
# 결과
Name: 0, dtype: object
                                            Name PClass  ...  Survived SexCode
1                    Allison, Miss Helen Loraine    1st  ...         0       1
2            Allison, Mr Hudson Joshua Creighton    1st  ...         0       0
3  Allison, Mrs Hudson JC (Bessie Waldo Daniels)    1st  ...         0       1


# 인덱스 설정
df2 = df.set_index(df['Name'])

# 행 확인
print(df2.loc['Allen, Miss Elisabeth Walton'])

# 결과
Name        Allen, Miss Elisabeth Walton
PClass                               1st
Age                                 29.0
Sex                               female
Survived                               1
SexCode                                1
Name: Allen, Miss Elisabeth Walton, dtype: object

 

조건에 따라 행 선택하기

import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

df = pd.read_csv(url)

# 'sex'열이 'female'인 행 중 처음 두 개를 출력
print(df[df['Sex'] == 'female'].head(2))

# 출력
                           Name PClass   Age     Sex  Survived  SexCode
0  Allen, Miss Elisabeth Walton    1st  29.0  female         1        1
1   Allison, Miss Helen Loraine    1st   2.0  female         0        1

# 65세 이상인 여성승객 출력
print(df[(df['Sex'] == 'female') & (df['Age'] >= 65)])

# 출력
                                                 Name PClass  ...  Survived SexCode
73  Crosby, Mrs Edward Gifford (Catherine Elizabet...    1st  ...         1       1

[1 rows x 6 columns]


 

값 치환하기

import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

df = pd.read_csv(url)

# 값 치환 후 두 개의 행 출력
print(df['Sex'].replace("female", "Woman").head(2))

# 출력
0    Woman
1    Woman
Name: Sex, dtype: object

# 여러개의 값 치환하기
print(df['Sex'].replace(["female", "male"], ["Woman", "Man"]).head(5))

# 출력
0    Woman
1    Woman
2      Man
3    Woman
4      Man
Name: Sex, dtype: object

# 값 치환 후 두 개의 행 출력
print(df.replace(1, "One").head(2))

# 출력
                           Name PClass   Age     Sex Survived SexCode
0  Allen, Miss Elisabeth Walton    1st  29.0  female      One     One
1   Allison, Miss Helen Loraine    1st   2.0  female        0     One

# 정규표현식을 이용하여 값 치환 후 두 개의 행 출력
print(df.replace(r"1st", "First", regex =True).head(2))

# 출력
                           Name PClass   Age     Sex  Survived  SexCode
0  Allen, Miss Elisabeth Walton  First  29.0  female         1        1
1   Allison, Miss Helen Loraine  First   2.0  female         0        1

# 딕셔너리로 바꿀 값을 매핑하여 전달하기
print(df.replace({"female: 1", "male:0"}).head(3))

# 출력
                                  Name PClass   Age     Sex  Survived  SexCode
0         Allen, Miss Elisabeth Walton    1st  29.0  female         1        1
1          Allison, Miss Helen Loraine    1st   2.0  female         0        1
2  Allison, Mr Hudson Joshua Creighton    1st  30.0    male         0        0

# female과 male을 person으로 치환
print(df.replace(["female", "male"], "person").head(3))

# 출력
                                  Name PClass   Age     Sex  Survived  SexCode
0         Allen, Miss Elisabeth Walton    1st  29.0  person         1        1
1          Allison, Miss Helen Loraine    1st   2.0  person         0        1
2  Allison, Mr Hudson Joshua Creighton    1st  30.0  person         0        0

 

열 이름 바꾸기

import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

df = pd.read_csv(url)

# 열 이름 변경후 두 개의 행 출력
print(df.rename(columns={"PClass" : "Passenger Class"}).head(2))

# 출력
                           Name Passenger Class  ...  Survived SexCode
0  Allen, Miss Elisabeth Walton             1st  ...         1       1
1   Allison, Miss Helen Loraine             1st  ...         0       1

# 여러개의 열 이름 변경
print(df.rename(columns={"PClass" : "Passenger Class", "Sex" : "Gender"}).head(2))

# 출력
                           Name Passenger Class  ...  Survived SexCode
0  Allen, Miss Elisabeth Walton             1st  ...         1       1
1   Allison, Miss Helen Loraine             1st  ...         0       1

[2 rows x 6 columns]

import collections
# 딕셔너리 생성하기
column_names = collections.defaultdict(str)

# 키 생성
for name in df.columns:
    column_names[name]

# 딕셔너리 출력
print(column_names)

# 출력
defaultdict(<class 'str'>, {'Name': '', 'PClass': '', 'Age': '', 'Sex': '', 'Survived': '', 'SexCode': ''})

 

최솟값, 최댓값, 합, 평균 계산 및 개수 세기

import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

df = pd.read_csv(url)

print('최댓값: ', df['Age'].max())
print('최솟값: ', df['Age'].min())
print('평균: ', df['Age'].mean())
print('합: ', df['Age'].sum())
print('카운트: ', df['Age'].count())

# 출력
최댓값:  71.0
최솟값:  0.17
평균:  30.397989417989418
합:  22980.88
카운트:  756

# 수치형 열의 공분산 출력
print(df.cov())

# 출력
                 Age  Survived   SexCode
Age       203.320470 -0.430491 -0.382054
Survived   -0.430491  0.225437  0.114070
SexCode    -0.382054  0.114070  0.228230

# 수치형 열의 상관계수 출력
print(df.corr())

# 출력
               Age  Survived   SexCode
Age       1.000000 -0.061254 -0.055138
Survived -0.061254  1.000000  0.502891
SexCode  -0.055138  0.502891  1.000000

 

고유한 값 찾기

import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

df = pd.read_csv(url)

# 고유한 값 출력
print(df['Sex'].unique())

# 출력 
['female' 'male']

# 고유한 값과 등장횟수 출력
print(df['Sex'].value_counts())

# 출력
male      851
female    462
Name: Sex, dtype: int64

 

누락된 값 다루기

import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

df = pd.read_csv(url)

# 누락된 값을 선택하고 두 개의 행을 출력
print(df[df['Age'].isnull()].head(2))

# 출력
                            Name PClass  Age     Sex  Survived  SexCode
12  Aubert, Mrs Leontine Pauline    1st  NaN  female         1        1
13      Barkworth, Mr Algernon H    1st  NaN    male         1        0

# NaN으로 값 변경하기
import numpy as np

df['Sex'] = df['Sex'].replace('male', np.nan)

 

열 삭제하기

import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

df = pd.read_csv(url)

# 열 삭제하기
print(df.drop('Age', axis=1).head(2))

# 출력
                           Name PClass     Sex  Survived  SexCode
0  Allen, Miss Elisabeth Walton    1st  female         1        1
1   Allison, Miss Helen Loraine    1st  female         0        1

# 여러개 삭제하기
print(df.drop(['Age', 'Sex'], axis=1).head(2))

# 출력
                           Name PClass  Survived  SexCode
0  Allen, Miss Elisabeth Walton    1st         1        1
1   Allison, Miss Helen Loraine    1st         0        1

 

행 삭제하기

import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

df = pd.read_csv(url)

# 행 삭제하기
print(df[df['Sex'] != 'male'].head(2))

# 출력
                           Name PClass   Age     Sex  Survived  SexCode
0  Allen, Miss Elisabeth Walton    1st  29.0  female         1        1
1   Allison, Miss Helen Loraine    1st   2.0  female         0        1

# 중복 행 삭제하기
# duplicates 는 모든 열이 완벽히 동일한 행만 삭제함
print(df.drop_duplicates().head(2))

# 출력
                           Name PClass   Age     Sex  Survived  SexCode
0  Allen, Miss Elisabeth Walton    1st  29.0  female         1        1
1   Allison, Miss Helen Loraine    1st   2.0  female         0        1

# 일부 열만 대상으로 중복된 행 삭제
print(df.drop_duplicates(subset=['Sex']))

# 출력
                                  Name PClass   Age     Sex  Survived  SexCode
0         Allen, Miss Elisabeth Walton    1st  29.0  female         1        1
2  Allison, Mr Hudson Joshua Creighton    1st  30.0    male         0        0

 

값에 따라 행 그룹핑하기

import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'

df = pd.read_csv(url)

# 'Sex' 열의 값2으로 행을 그룹핑하고 평균을 계산
print(df.groupby('Sex').mean())

# 출력
              Age  Survived  SexCode
Sex                                 
female  29.396424  0.666667      1.0
male    31.014338  0.166863      0.0

# 행을 그룹핑하고 카운팅
print(df.groupby('Survived')['Name'].count())
Survived
0    863
1    450
Name: Name, dtype: int64

 

시간에 따라 행을 그룹핑하기

import pandas as pd
import numpy as np

# 날짜 범위 만들기
time_index = pd.date_range('06/06/2017', periods=100000, freq='30S')

# 데이터 프레임 생성
df = pd.DataFrame(index = time_index)

# 난숫값으로 열 생성
df['Sale_Amount'] = np.random.randint(1, 10, 100000)

# 주 단위로 행을 그룹핑하고 합을 계산
print(df.resample('W').sum())

# 출력
            Sale_Amount
2017-06-11        86506
2017-06-18       100296
2017-06-25       100271
2017-07-02       101455
2017-07-09       100606
2017-07-16        10382

 

열 원소 순회하기

import pandas as pd
import numpy as np

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'
df = pd.read_csv(url)

# 처음 두 이름을 대문자로 바꾸어 출력
for name in df['Name'][0:2]:
    print(name.upper())

# 출력
ALLEN, MISS ELISABETH WALTON
ALLISON, MISS HELEN LORAINE

# 리스트 컴프리헨션 사용하기
print([name.upper() for name in df['Name'][0:2]])

# 출력
['ALLEN, MISS ELISABETH WALTON', 'ALLISON, MISS HELEN LORAINE']

모든 열 원소에 함수 적용하기

 

import pandas as pd
import numpy as np

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'
df = pd.read_csv(url)

# 함수 생성
def uppercase(x):
    return x.upper()

# 함수를 적용하고 출력
print(df['Name'].apply(uppercase)[0:2])

# 출력
0    ALLEN, MISS ELISABETH WALTON
1     ALLISON, MISS HELEN LORAINE
Name: Name, dtype: object

# Survived 열의 1을 Live로 0을 Dead로 변경
print(df['Survived'].map({1:'Live', 0:'Dead'})[:5])

# 출력
0    Live
1    Dead
2    Dead
3    Dead
4    Live
Name: Survived, dtype: object

# 각 열에서 가장 큰 값을 뽑기
print(df.apply(lambda x: max(x)))

#  출력
Name        del Carlo, Mrs Sebastiano (Argenia Genovese)
PClass                                               3rd
Age                                                 71.0
Sex                                                 male
Survived                                               1
SexCode                                                1
dtype: object

 

그룹에 함수 적용하기

import pandas as pd
import numpy as np

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'
df = pd.read_csv(url)

# 행을 그룹핑한 다음 함수를 적용
print(df.groupby('Sex').apply(lambda x: x.count()))

# 출력
        Name  PClass  Age  Sex  Survived  SexCode
Sex                                              
female   462     462  288  462       462      462
male     851     851  468  851       851      851

 

데이터프레임 연결하기

import pandas as pd
import numpy as np


url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'
df = pd.read_csv(url)
df2 =  pd.read_csv(url)

# 행 방향으로 데이터프레임 연결
print(pd.concat([df, df2], axis=0))

# 출력
                                               Name PClass  ...  Survived SexCode
0                      Allen, Miss Elisabeth Walton    1st  ...         1       1
1                       Allison, Miss Helen Loraine    1st  ...         0       1
2               Allison, Mr Hudson Joshua Creighton    1st  ...         0       0
3     Allison, Mrs Hudson JC (Bessie Waldo Daniels)    1st  ...         0       1
4                     Allison, Master Hudson Trevor    1st  ...         1       0
...                                             ...    ...  ...       ...     ...
1308                             Zakarian, Mr Artun    3rd  ...         0       0
1309                         Zakarian, Mr Maprieder    3rd  ...         0       0
1310                               Zenni, Mr Philip    3rd  ...         0       0
1311                               Lievens, Mr Rene    3rd  ...         0       0
1312                                 Zimmerman, Leo    3rd  ...         0       0

[2626 rows x 6 columns]

# 열 방향으로 데이터프레임 연결
print(pd.concat([df, df2], axis=1))

# 출력
                                               Name PClass  ...  Survived SexCode
0                      Allen, Miss Elisabeth Walton    1st  ...         1       1
1                       Allison, Miss Helen Loraine    1st  ...         0       1
2               Allison, Mr Hudson Joshua Creighton    1st  ...         0       0
3     Allison, Mrs Hudson JC (Bessie Waldo Daniels)    1st  ...         0       1
4                     Allison, Master Hudson Trevor    1st  ...         1       0
...                                             ...    ...  ...       ...     ...
1308                             Zakarian, Mr Artun    3rd  ...         0       0
1309                         Zakarian, Mr Maprieder    3rd  ...         0       0
1310                               Zenni, Mr Philip    3rd  ...         0       0
1311                               Lievens, Mr Rene    3rd  ...         0       0
1312                                 Zimmerman, Leo    3rd  ...         0       0

[1313 rows x 12 columns]