본문 바로가기
코딩/데이터 분석

판다스(Pandas)

by Song1234 2024. 6. 7.

1. 판다스(Pandas)

  • 데이터 분석을 위한 파이썬 라이브러리 중 하나로, 표 형태의 데이터나 다양한 형태의 데이터를 쉽게 처리하고 분석
  • 데이터프레임(DataFramge)이라는 자료구조를 제공
!pip install pandas
Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (2.0.3)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2023.4)
Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.1)
Requirement already satisfied: numpy>=1.21.0 in /usr/local/lib/python3.10/dist-packages (from pandas) (1.25.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)
import pandas as pd

2. Series와 DataFrame

2-1. Series

  • Series는 1차원 배열과 같은 구조로 하나의 열을 나타냄
  • Series의 각 요소는 인덱스(index)와 값(value)으로 구성되어 있음
  • 값은 넘파이의 ndarray 기반으로 저장됨
  • Series는 다양한 데이터 타입을 가질 수 있으며, 정수, 실수, 문자열 등 다양한 형태의 데이터를 담을 수 있음
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']

data = [67, 75, 75, 62, 98]
\# Series(데이터, 인덱스)

pd.Series(data)
0    67
1    75
2    75
3    62
4    98
dtype: int64
se1 = pd.Series(data, idx)

se1
김사과    67
반하나    75
오렌지    75
이메론    62
배애리    98
dtype: int64
print(se1.index)

print(se1.values)
Index(['김사과', '반하나', '오렌지', '이메론', '배애리'], dtype='object')
[67 75 75 62 98]

2-2. DataFrame

  • 데이터프레임은 판다스 라이브러리에서 제공하는 중요하고 강력한 데이터 구조로, 2차원의 테이블 형태 데이터를 다룸
  • 데이터프레임의 각 요소는 인덱스(index), 열(column), 값(value)으로 구성되어 있음
  • 데이터프레임은 행과 열로 이루어져 있으며, 각 열은 다양한 데이터 타입을 가질 수 있음
  • 값은 넘파이의 ndarray 기반으로 저장
data = [[67, 93, 91],

        [75, 68, 96],

        [76, 81, 82],

        [62, 70, 75],

        [98, 56, 87]]

idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']

col = ['국어', '영어', '수학']



# DataFrmae(데이터, 인덱스, 컬럼, ...)

pd.DataFrame(data)

01201234

67 93 91
75 68 96
76 81 82
62 70 75
98 56 87
pd.DataFrame(data, idx)

012김사과반하나오렌지이메론배애리

67 93 91
75 68 96
76 81 82
62 70 75
98 56 87
df = pd.DataFrame(data, idx, col)

df

국어영어수학김사과반하나오렌지이메론배애리

67 93 91
75 68 96
76 81 82
62 70 75
98 56 87
print(df.index)

print(df.columns)

print(df.values)
Index(['김사과', '반하나', '오렌지', '이메론', '배애리'], dtype='object')
Index(['국어', '영어', '수학'], dtype='object')
[[67 93 91]
 [75 68 96]
 [76 81 82]
 [62 70 75]
 [98 56 87]]

2-3. 딕셔너리를 사용하여 데이터프레임을 생성하기

dic = {

'국어': [67, 75, 76, 62, 98],

'영어': [93, 68, 81, 70, 56],

'수학': [91, 96, 82, 75, 87]

}
df = pd.DataFrame(data=dic, index=idx)

df

국어영어수학김사과반하나오렌지이메론배애리

67 93 91
75 68 96
76 81 82
62 70 75
98 56 87

3. CSV 파일 읽어오기

  • csv(Comma Separated Value)의 약자로 데이터를 쉼표로 구분한 파일
df = pd.read_csv('/content/drive/MyDrive/KDT/5.데이터 분석/데이터/idol.csv')

df

이름그룹소속사성별생년월일키혈액형브랜드평판지수012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
from google.colab import drive

drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
type(df)
pandas.core.frame.DataFrame
def __init__(data=None, index: Axes | None=None, columns: Axes | None=None, dtype: Dtype | None=None, copy: bool | None=None) -> None
Two-dimensional, size-mutable, potentially heterogeneous tabular data.

Data structure also contains labeled axes (rows and columns).
Arithmetic operations align on both row and column labels. Can be
thought of as a dict-like container for Series objects. The primary
pandas data structure.

Parameters
----------
data : ndarray (structured or homogeneous), Iterable, dict, or DataFrame
    Dict can contain Series, arrays, constants, dataclass or list-like objects. If
    data is a dict, column order follows insertion-order. If a dict contains Series
    which have an index defined, it is aligned by its index. This alignment also
    occurs if data is a Series or a DataFrame itself. Alignment is done on
    Series/DataFrame inputs.

    If data is a list of dicts, column order follows insertion-order.

index : Index or array-like
    Index to use for resulting frame. Will default to RangeIndex if
    no indexing information part of input data and no index provided.
columns : Index or array-like
    Column labels to use for resulting frame when data does not have them,
    defaulting to RangeIndex(0, 1, 2, ..., n). If data contains column labels,
    will perform column selection instead.
dtype : dtype, default None
    Data type to force. Only a single dtype is allowed. If None, infer.
copy : bool or None, default None
    Copy data from inputs.
    For dict data, the default of None behaves like ``copy=True``.  For DataFrame
    or 2d ndarray input, the default of None behaves like ``copy=False``.
    If data is a dict containing one or more Series (possibly of different dtypes),
    ``copy=False`` will ensure that these inputs are not copied.

    .. versionchanged:: 1.3.0

See Also
--------
DataFrame.from_records : Constructor from tuples, also record arrays.
DataFrame.from_dict : From dicts of Series, arrays, or dicts.
read_csv : Read a comma-separated values (csv) file into DataFrame.
read_table : Read general delimited file into DataFrame.
read_clipboard : Read text from clipboard into DataFrame.

Notes
-----
Please reference the :ref:`User Guide <basics.dataframe>` for more information.

Examples
--------
Constructing DataFrame from a dictionary.

>>> d = {'col1': [1, 2], 'col2': [3, 4]}
>>> df = pd.DataFrame(data=d)
>>> df
   col1  col2
0     1     3
1     2     4

Notice that the inferred dtype is int64.

>>> df.dtypes
col1    int64
col2    int64
dtype: object

To enforce a single dtype:

>>> df = pd.DataFrame(data=d, dtype=np.int8)
>>> df.dtypes
col1    int8
col2    int8
dtype: object

Constructing DataFrame from a dictionary including Series:

>>> d = {'col1': [0, 1, 2, 3], 'col2': pd.Series([2, 3], index=[2, 3])}
>>> pd.DataFrame(data=d, index=[0, 1, 2, 3])
   col1  col2
0     0   NaN
1     1   NaN
2     2   2.0
3     3   3.0

Constructing DataFrame from numpy ndarray:

>>> df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
...                    columns=['a', 'b', 'c'])
>>> df2
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

Constructing DataFrame from a numpy ndarray that has labeled columns:

>>> data = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)],
...                 dtype=[("a", "i4"), ("b", "i4"), ("c", "i4")])
>>> df3 = pd.DataFrame(data, columns=['c', 'a'])
...
>>> df3
   c  a
0  3  1
1  6  4
2  9  7

Constructing DataFrame from dataclass:

>>> from dataclasses import make_dataclass
>>> Point = make_dataclass("Point", [("x", int), ("y", int)])
>>> pd.DataFrame([Point(0, 0), Point(0, 3), Point(2, 3)])
   x  y
0  0  0
1  0  3
2  2  3

Constructing DataFrame from Series/DataFrame:

>>> ser = pd.Series([1, 2, 3], index=["a", "b", "c"])
>>> df = pd.DataFrame(data=ser, index=["a", "c"])
>>> df
   0
a  1
c  3

>>> df1 = pd.DataFrame([1, 2, 3], index=["a", "b", "c"], columns=["x"])
>>> df2 = pd.DataFrame(data=df1, index=["a", "c"])
>>> df2
   x
a  1
c  3

4. 데이터프레임 기본정보 알아보기

# info(): 행(row), 열(column)의 기본적인 정보와 데이터 타입을 반환

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 8 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   이름       20 non-null     object 
 1   그룹       20 non-null     object 
 2   소속사      19 non-null     object 
 3   성별       20 non-null     object 
 4   생년월일     20 non-null     object 
 5   키        19 non-null     float64
 6   혈액형      19 non-null     object 
 7   브랜드평판지수  20 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.4+ KB
# 컬럼명 변경하기

print(df.columns)

new_column = ['name', 'group', 'company', 'gender', 'birthday', 'height', 'blood', 'brand']

df.columns = new_column

print(df.columns)
Index(['이름', '그룹', '소속사', '성별', '생년월일', '키', '혈액형', '브랜드평판지수'], dtype='object')
Index(['name', 'group', 'company', 'gender', 'birthday', 'height', 'blood',
       'brand'],
      dtype='object')
df

namegroupcompanygenderbirthdayheightbloodbrand012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
# describe(): 통계 정보를 반환

df.describe()

:

heightbrandcountmeanstdmin25%50%75%max

19.000000 2.000000e+01
170.536842 2.700190e+06
7.225204 1.381919e+06
161.000000 1.680587e+06
164.750000 1.887423e+06
168.000000 2.074682e+06
179.000000 2.623465e+06
182.000000 6.267302e+06
df.describe(include=object) # top : 최빈값, freq: 최빈값의 빈도

namegroupcompanygenderbirthdaybloodcountuniquetopfreq

20 20 19 20 20 19
20 6 5 2 20 4
지민 방탄소년단 빅히트 여자 1995-10-13 A
1 5 7 13 1 11
# 원하는 개수의 데이터 보기

df.head() # 상위 5개의 row를 출력 > 기본값

namegroupcompanygenderbirthdayheightbloodbrand01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
df.head(3)

namegroupcompanygenderbirthdayheightbloodbrand012

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
df.tail() # 하위 5개의 row를 출력 > 기본값

namegroupcompanygenderbirthdayheightbloodbrand1516171819

윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
df.tail(2)

namegroupcompanygenderbirthdayheightbloodbrand1819

강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
# 정렬하기

df.sort_index() # index로 오름차순 정렬: 기본값

namegroupcompanygenderbirthdayheightbloodbrand012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
df.sort_index(ascending=False) # index로 내림순 정렬

namegroupcompanygenderbirthdayheightbloodbrand191817161514131211109876543210

방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
df.sort_values(by='height') # height로 오름차순 정렬

namegroupcompanygenderbirthdayheightbloodbrand173711851316151426019411210189

슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
df.sort_values(by='height', ascending=False) # height로 내림차순 정렬

namegroupcompanygenderbirthdayheightbloodbrand181011219406214151613581173179

강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
df.sort_values(by='height', ascending=False, na_position='first') # height로 내림차순 정렬 / NaN 값을 맨 위로

namegroupcompanygenderbirthdayheightbloodbrand918101121940621415161358117317

태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
# 1차 정렬 : 키(내림차순), 2차정렬 : 브랜드(내림차순)

df.sort_values(by=['height', 'brand'], ascending=[False, False])

namegroupcompanygenderbirthdayheightbloodbrand181014121906214151613581173179

강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866

5. 데이터 다루기

df.head()

namegroupcompanygenderbirthdayheightbloodbrand01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
df['blood']
0       A
1       A
2       A
3       O
4      AB
5     NaN
6       O
7       A
8       B
9       A
10      A
11      B
12      A
13      A
14      B
15      B
16      A
17      A
18      A
19      O
Name: blood, dtype: object
type(df['blood'])
pandas.core.series.Series
def __init__(data=None, index=None, dtype: Dtype | None=None, name=None, copy: bool | None=None, fastpath: bool=False) -> None
One-dimensional ndarray with axis labels (including time series).

Labels need not be unique but must be a hashable type. The object
supports both integer- and label-based indexing and provides a host of
methods for performing operations involving the index. Statistical
methods from ndarray have been overridden to automatically exclude
missing data (currently represented as NaN).

Operations between Series (+, -, /, \*, \*\*) align values based on their
associated index values-- they need not be the same length. The result
index will be the sorted union of the two indexes.

Parameters
----------
data : array-like, Iterable, dict, or scalar value
    Contains data stored in Series. If data is a dict, argument order is
    maintained.
index : array-like or Index (1d)
    Values must be hashable and have the same length as `data`.
    Non-unique index values are allowed. Will default to
    RangeIndex (0, 1, 2, ..., n) if not provided. If data is dict-like
    and index is None, then the keys in the data are used as the index. If the
    index is not None, the resulting Series is reindexed with the index values.
dtype : str, numpy.dtype, or ExtensionDtype, optional
    Data type for the output Series. If not specified, this will be
    inferred from `data`.
    See the :ref:`user guide <basics.dtypes>` for more usages.
name : Hashable, default None
    The name to give to the Series.
copy : bool, default False
    Copy input data. Only affects Series or 1d ndarray input. See examples.

Notes
-----
Please reference the :ref:`User Guide <basics.series>` for more information.

Examples
--------
Constructing Series from a dictionary with an Index specified

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> ser = pd.Series(data=d, index=['a', 'b', 'c'])
>>> ser
a   1
b   2
c   3
dtype: int64

The keys of the dictionary match with the Index values, hence the Index
values have no effect.

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> ser = pd.Series(data=d, index=['x', 'y', 'z'])
>>> ser
x   NaN
y   NaN
z   NaN
dtype: float64

Note that the Index is first build with the keys from the dictionary.
After this the Series is reindexed with the given Index values, hence we
get all NaN as a result.

Constructing Series from a list with `copy=False`.

>>> r = [1, 2]
>>> ser = pd.Series(r, copy=False)
>>> ser.iloc[0] = 999
>>> r
[1, 2]
>>> ser
0    999
1      2
dtype: int64

Due to input data type the Series has a `copy` of
the original data even though `copy=False`, so
the data is unchanged.

Constructing Series from a 1d ndarray with `copy=False`.

>>> r = np.array([1, 2])
>>> ser = pd.Series(r, copy=False)
>>> ser.iloc[0] = 999
>>> r
array([999,   2])
>>> ser
0    999
1      2
dtype: int64

Due to input data type the Series has a `view` on
the original data, so
the data is changed as well.
df.blood
0       A
1       A
2       A
3       O
4      AB
5     NaN
6       O
7       A
8       B
9       A
10      A
11      B
12      A
13      A
14      B
15      B
16      A
17      A
18      A
19      O
Name: blood, dtype: object
df.head(3)

namegroupcompanygenderbirthdayheightbloodbrand012

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
# 범위 선택

df[:3]

namegroupcompanygenderbirthdayheightbloodbrand012

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
# loc 인덱싱: 이름 인덱싱, 행과 열 모두 인덱싱과 슬라이싱이 가능

df.loc[:,'name'] # df['name']
0       지민
1       정국
2       민지
3       하니
4        뷔
5      다니엘
6       혜인
7       지수
8       해린
9       태연
10      RM
11      제니
12     옹성우
13      리사
14      로제
15      윤아
16      조이
17      슬기
18    강다니엘
19       진
Name: name, dtype: object
df.loc[2:5, 'name'] # 5번을 포함
2     민지
3     하니
4      뷔
5    다니엘
Name: name, dtype: object
df.loc[2:5, ['name', 'gender', 'height']]

namegenderheight2345

민지 여자 169.0
하니 여자 161.7
남자 179.0
다니엘 여자 165.0
df.loc[2:5, 'name':'gender']

namegroupcompanygender2345

민지 뉴진스 어도어 여자
하니 뉴진스 어도어 여자
방탄소년단 빅히트 남자
다니엘 뉴진스 어도어 여자
# iloc 인덱싱: index로 인덱싱, 행과 열 모두 인덱싱과 슬라이싱이 가능

df.iloc[:, 0]
0       지민
1       정국
2       민지
3       하니
4        뷔
5      다니엘
6       혜인
7       지수
8       해린
9       태연
10      RM
11      제니
12     옹성우
13      리사
14      로제
15      윤아
16      조이
17      슬기
18    강다니엘
19       진
Name: name, dtype: object
df.iloc[:, [0,2]]

namecompany012345678910111213141516171819

지민 빅히트
정국 빅히트
민지 어도어
하니 어도어
빅히트
다니엘 어도어
혜인 어도어
지수 와이지
해린 어도어
태연 에스엠
RM 빅히트
제니 와이지
옹성우 판타지오
리사 와이지
로제 와이지
윤아 에스엠
조이 빅히트
슬기 빅히트
강다니엘 NaN
빅히트
df.iloc[:, 0:2] # 2번 컬럼을 포함하지 않음

namegroup012345678910111213141516171819

지민 방탄소년단
정국 방탄소년단
민지 뉴진스
하니 뉴진스
방탄소년단
다니엘 뉴진스
혜인 뉴진스
지수 블랙핑크
해린 뉴진스
태연 소녀시대
RM 방탄소년단
제니 블랙핑크
옹성우 워너원
리사 블랙핑크
로제 블랙핑크
윤아 소녀시대
조이 레드벨벳
슬기 레드벨벳
강다니엘 워너원
방탄소년단
df.iloc[1:5, 0:2]

namegroup1234

정국 방탄소년단
민지 뉴진스
하니 뉴진스
방탄소년단
df['height'] >= 180
0     False
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10     True
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18     True
19    False
Name: height, dtype: bool
df['name'][df['height'] >= 180] # df[df['heught'] >= 180]['name']
10      RM
18    강다니엘
Name: name, dtype: object

문제

  • 키가 180cm 이상인 연예인의 이름, 성별, 키, 브랜드평판지수를 출력 단, loc를 사용
df.loc[df['height'] >= 180, ['name', 'gender', 'height', 'brand']]

namegenderheightbrand1018

RM 남자 181.0 2069499
강다니엘 남자 182.0 1706444
# isin(): 정의한 list에 있는 데이터를 불린으로 반환

df

namegroupcompanygenderbirthdayheightbloodbrand012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
company = ['빅히트', '어도어']

df['company'].isin(company) # df[df['company'].isin(company), :]
0      True
1      True
2      True
3      True
4      True
5      True
6      True
7     False
8      True
9     False
10     True
11    False
12    False
13    False
14    False
15    False
16     True
17     True
18    False
19     True
Name: company, dtype: bool

6. 결측값(Null, NaN)

  • 비어있는 값, 판다스에서는 NaN(Not a Number)로 표기 된 것은 모두 결측값으로 취급
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 8 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   name      20 non-null     object 
 1   group     20 non-null     object 
 2   company   19 non-null     object 
 3   gender    20 non-null     object 
 4   birthday  20 non-null     object 
 5   height    19 non-null     float64
 6   blood     19 non-null     object 
 7   brand     20 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.4+ KB
df.isna()

namegroupcompanygenderbirthdayheightbloodbrand012345678910111213141516171819

False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False True False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False True False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False True False False False False False
False False False False False False False False
df.isnull()

namegroupcompanygenderbirthdayheightbloodbrand012345678910111213141516171819

False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False True False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False True False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False
False False True False False False False False
False False False False False False False False
df['height'].isna()
0     False
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9      True
10    False
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18    False
19    False
Name: height, dtype: bool
df[df['height'].isna()]

namegroupcompanygenderbirthdayheightbloodbrand9

태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
df[df['height'].isna()]['name']
9    태연
Name: name, dtype: object
df[df['height'].notnull()]

namegroupcompanygenderbirthdayheightbloodbrand01234567810111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587

 

  • 회사가 있는 연예인의 이름,회사,키를 출력

[ ]:

df.loc[df['company'].notnull(), ['name', 'company', 'height']]

[75]:

namecompanyheight0123456789101112131415161719

지민 빅히트 174.0
정국 빅히트 179.0
민지 어도어 169.0
하니 어도어 161.7
빅히트 179.0
다니엘 어도어 165.0
혜인 어도어 170.0
지수 와이지 162.0
해린 어도어 164.5
태연 에스엠 NaN
RM 빅히트 181.0
제니 와이지 163.0
옹성우 판타지오 179.0
리사 와이지 167.0
로제 와이지 168.0
윤아 에스엠 168.0
조이 빅히트 168.0
슬기 빅히트 161.0
빅히트 179.0

[ ]:

# fillna(): 결측값을 채워주는 함수

df['height']

[76]:

0     174.0
1     179.0
2     169.0
3     161.7
4     179.0
5     165.0
6     170.0
7     162.0
8     164.5
9       NaN
10    181.0
11    163.0
12    179.0
13    167.0
14    168.0
15    168.0
16    168.0
17    161.0
18    182.0
19    179.0
Name: height, dtype: float64

[ ]:

df['height'].fillna(0) # 값이 리턴되지 않음 df['height'].fillna(0, inplace=True) #적용

[77]:

0     174.0
1     179.0
2     169.0
3     161.7
4     179.0
5     165.0
6     170.0
7     162.0
8     164.5
9       0.0
10    181.0
11    163.0
12    179.0
13    167.0
14    168.0
15    168.0
16    168.0
17    161.0
18    182.0
19    179.0
Name: height, dtype: float64

[ ]:

df['height']

[78]:

0     174.0
1     179.0
2     169.0
3     161.7
4     179.0
5     165.0
6     170.0
7     162.0
8     164.5
9       NaN
10    181.0
11    163.0
12    179.0
13    167.0
14    168.0
15    168.0
16    168.0
17    161.0
18    182.0
19    179.0
Name: height, dtype: float64

[ ]:

df_copy = df.copy()

df_copy

[79]:

namegroupcompanygenderbirthdayheightbloodbrand012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587

[ ]:

height = df_copy['height'].mean()

# height = df_copy['height'].median() #50% 중위값

height

[80]:

170.53684210526316

[ ]:

df_copy

[81]:

namegroupcompanygenderbirthdayheightbloodbrand012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587

[ ]:

df_copy['height'].fillna(height, inplace=True)

df_copy['height']

[82]:

0     174.000000
1     179.000000
2     169.000000
3     161.700000
4     179.000000
5     165.000000
6     170.000000
7     162.000000
8     164.500000
9     170.536842
10    181.000000
11    163.000000
12    179.000000
13    167.000000
14    168.000000
15    168.000000
16    168.000000
17    161.000000
18    182.000000
19    179.000000
Name: height, dtype: float64

[ ]:

df_copy = df.copy()

df_copy

[83]:

namegroupcompanygenderbirthdayheightbloodbrand012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587

[ ]:

# dropna(): 결측값이 있는 행, 열을 제거. 결측값이 한개라도 있는 경우 삭제

df_copy.dropna() # axis = 0 (행삭제 생략)

[84]:

namegroupcompanygenderbirthdayheightbloodbrand01234678101112131415161719

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587

[ ]:

# 결측값이 있는 열을 제거

df_copy.dropna(axis=1)

[85]:

namegroupgenderbirthdaybrand012345678910111213141516171819

지민 방탄소년단 남자 1995-10-13 6267302
정국 방탄소년단 남자 1997-09-01 5805844
민지 뉴진스 여자 2004-05-07 4437081
하니 뉴진스 여자 2004-10-06 4161153
방탄소년단 남자 1995-12-30 3470048
다니엘 뉴진스 여자 2005-04-11 2341271
혜인 뉴진스 여자 2008-04-21 2301785
지수 블랙핑크 여자 1995-01-03 2227460
해린 뉴진스 여자 2006-05-15 2173376
태연 소녀시대 여자 1989-03-09 2079866
RM 방탄소년단 남자 1994-09-12 2069499
제니 블랙핑크 여자 1996-01-16 2069250
옹성우 워너원 남자 1995-08-25 1954327
리사 블랙핑크 여자 1997-03-27 1912800
로제 블랙핑크 여자 1997-02-11 1888132
윤아 소녀시대 여자 1990-05-30 1885297
조이 레드벨벳 여자 1996-09-03 1830514
슬기 레드벨벳 여자 1994-02-10 1741767
강다니엘 워너원 남자 1996-12-10 1706444
방탄소년단 남자 1992-12-04 1680587

7. 행, 열 추가 및 삭제하기

  • 행을 추가할 때 dict 형태의 데이터를 만들고 append() 메서드를 사용하여 데이터를 추가
  • ignore_index=True 옵션을 추가해야 에러가 발생하지 않음

[ ]:

dic = {

'name': '김사과',

'group': '과수원',

'company': '애플',

'gender': '여자',

'birthday': '2000-01-01',

'height': 160,

'blood': 'A',

'brand': 1234567

}

[ ]:

# 행 추가하기

df = pd.concat([df, pd.DataFrame(dic, index=[0])], ignore_index=True)

df

[87]:

namegroupcompanygenderbirthdayheightbloodbrand01234567891011121314151617181920

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
김사과 과수원 애플 여자 2000-01-01 160.0 A 1234567

[ ]:

# 열 추가하기

df['nation'] = '대한민국'

df.head()

[88]:

namegroupcompanygenderbirthdayheightbloodbrandnation01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 대한민국
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 대한민국
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 대한민국
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 대한민국
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 대한민국

문제

  • '김사과' 국적을 '미국'으로 변경
  • 단, loc 사용

[ ]:

df.loc[df['name'] == '김사과', 'nation'] = '미국'

df

[89]:

namegroupcompanygenderbirthdayheightbloodbrandnation01234567891011121314151617181920

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 대한민국
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 대한민국
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 대한민국
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 대한민국
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 대한민국
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 대한민국
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 대한민국
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 대한민국
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 대한민국
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 대한민국
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 대한민국
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 대한민국
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 대한민국
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 대한민국
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 대한민국
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 대한민국
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 대한민국
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 대한민국
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 대한민국
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 대한민국
김사과 과수원 애플 여자 2000-01-01 160.0 A 1234567 미국

[ ]:

# 행 제거하기

df.drop(20, axis=0)

[90]:

namegroupcompanygenderbirthdayheightbloodbrandnation012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 대한민국
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 대한민국
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 대한민국
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 대한민국
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 대한민국
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 대한민국
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 대한민국
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 대한민국
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 대한민국
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 대한민국
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 대한민국
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 대한민국
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 대한민국
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 대한민국
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 대한민국
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 대한민국
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 대한민국
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 대한민국
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 대한민국
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 대한민국

[ ]:

df.drop([1, 3, 5, 20], axis=0)

[91]:

namegroupcompanygenderbirthdayheightbloodbrandnation024678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 대한민국
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 대한민국
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 대한민국
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 대한민국
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 대한민국
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 대한민국
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 대한민국
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 대한민국
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 대한민국
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 대한민국
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 대한민국
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 대한민국
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 대한민국
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 대한민국
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 대한민국
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 대한민국
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 대한민국

[ ]:

# 열 제거하기

df.drop('nation', axis=1)

[92]:

namegroupcompanygenderbirthdayheightbloodbrand01234567891011121314151617181920

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
김사과 과수원 애플 여자 2000-01-01 160.0 A 1234567

[ ]:

df.drop(['group', 'nation'], axis=1)

[93]:

namecompanygenderbirthdayheightbloodbrand01234567891011121314151617181920

지민 빅히트 남자 1995-10-13 174.0 A 6267302
정국 빅히트 남자 1997-09-01 179.0 A 5805844
민지 어도어 여자 2004-05-07 169.0 A 4437081
하니 어도어 여자 2004-10-06 161.7 O 4161153
빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 어도어 여자 2008-04-21 170.0 O 2301785
지수 와이지 여자 1995-01-03 162.0 A 2227460
해린 어도어 여자 2006-05-15 164.5 B 2173376
태연 에스엠 여자 1989-03-09 NaN A 2079866
RM 빅히트 남자 1994-09-12 181.0 A 2069499
제니 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 판타지오 남자 1995-08-25 179.0 A 1954327
리사 와이지 여자 1997-03-27 167.0 A 1912800
로제 와이지 여자 1997-02-11 168.0 B 1888132
윤아 에스엠 여자 1990-05-30 168.0 B 1885297
조이 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 NaN 남자 1996-12-10 182.0 A 1706444
빅히트 남자 1992-12-04 179.0 O 1680587
김사과 애플 여자 2000-01-01 160.0 A 1234567

8. 통계 함수

[ ]:

df.describe()

[94]:

heightbrandcountmeanstdmin25%50%75%max

20.000000 2.100000e+01
170.010000 2.630399e+06
7.416688 1.384378e+06
160.000000 1.234567e+06
164.125000 1.885297e+06
168.000000 2.069499e+06
179.000000 2.341271e+06
182.000000 6.267302e+06

[ ]:

df['height'].sum() # 합계

[95]:

3400.2

[ ]:

df['height'].count() # 개수, NaN은 포함하지 않음

[96]:

20

[ ]:

df['height'].mean() # 평균

[97]:

170.01

[ ]:

df['height'].median() # 중앙값

[98]:

168.0

[ ]:

df['height'].max() # 최대값

[99]:

182.0

[ ]:

df['height'].min() # 최소값

[100]:

160.0

[ ]:

df['height'].var() # 분산: 확률 분포에서 데이터가 퍼져있는 정도 ( 데이터가 평균으로 부터 얼마나 퍼져 있는지)

# (데이터 - 평균 ) ** 2 을 모두 다 더한 값 / 데이터의 개수

[101]:

55.00726315789475

[ ]:

# 표준편차 : 분산에 루트를 씌움

df['height'].std()

[102]:

7.416688152935564

9. 그룹

[ ]:

df

[103]:

namegroupcompanygenderbirthdayheightbloodbrandnation01234567891011121314151617181920

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 대한민국
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 대한민국
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 대한민국
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 대한민국
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 대한민국
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 대한민국
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 대한민국
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 대한민국
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 대한민국
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 대한민국
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 대한민국
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 대한민국
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 대한민국
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 대한민국
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 대한민국
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 대한민국
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 대한민국
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 대한민국
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 대한민국
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 대한민국
김사과 과수원 애플 여자 2000-01-01 160.0 A 1234567 미국

[ ]:

# groupby(): 데이터를 그룹으로 묶어 분석할 때 사용

df.groupby('group')

[104]:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7e344b7b8fa0>

[ ]:

df.groupby('group').count()

[105]:

namecompanygenderbirthdayheightbloodbrandnationgroup과수원뉴진스레드벨벳방탄소년단블랙핑크소녀시대워너원

1 1 1 1 1 1 1 1
5 5 5 5 5 4 5 5
2 2 2 2 2 2 2 2
5 5 5 5 5 5 5 5
4 4 4 4 4 4 4 4
2 2 2 2 1 2 2 2
2 1 2 2 2 2 2 2

[ ]:

df.groupby('group').mean(numeric_only=True)

[106]:

heightbrandgroup과수원뉴진스레드벨벳방탄소년단블랙핑크소녀시대워너원

160.00 1234567.0
166.04 3082933.2
164.50 1786140.5
178.40 3858656.0
165.00 2024410.5
168.00 1982581.5
180.50 1830385.5

[ ]:

df.groupby('group').sum(numeric_only=True)

[107]:

heightbrandgroup과수원뉴진스레드벨벳방탄소년단블랙핑크소녀시대워너원

160.0 1234567
830.2 15414666
329.0 3572281
892.0 19293280
660.0 8097642
168.0 3965163
361.0 3660771

[ ]:

df.groupby('gender').sum(numeric_only=True)

[108]:

heightbrandgender남자여자

1253.0 22954051
2147.2 32284319

문제1

  • 혈액형별로 그룹을 맺어, 키의 평균값을 확인

[ ]:

df.groupby('blood')['height'].mean()

[109]:

blood
A     171.090909
AB    179.000000
B     165.875000
O     170.233333
Name: height, dtype: float64

문제2

  • 혈액형별로 그룹을 맺고, 성별로 또 그룹을 나눈 후, 키의 평균값을 확인

10.중복값 제거하기

[ ]:

df['blood']

[110]:

0       A
1       A
2       A
3       O
4      AB
5     NaN
6       O
7       A
8       B
9       A
10      A
11      B
12      A
13      A
14      B
15      B
16      A
17      A
18      A
19      O
20      A
Name: blood, dtype: object

[ ]:

# drop_duplicates(): 중복된 데이터를 제거

df['blood'].drop_duplicates()

[111]:

0      A
3      O
4     AB
5    NaN
8      B
Name: blood, dtype: object

[ ]:

df['blood'].drop_duplicates(keep='last')

df['blood'].count()

[112]:

20

[ ]:

# value_counts(): 열의 각 값에 대한 데이터의 개수를 반환. NaN은 생략

df['blood'].value_counts()

[113]:

blood
A     12
B      4
O      3
AB     1
Name: count, dtype: int64

[ ]:

df['company'].value_counts()

[114]:

company
빅히트     7
어도어     5
와이지     4
에스엠     2
판타지오    1
애플      1
Name: count, dtype: int64

[ ]:

df['company'].value_counts(dropna=False) # NaN을 표기

[115]:

company
빅히트     7
어도어     5
와이지     4
에스엠     2
판타지오    1
NaN     1
애플      1
Name: count, dtype: int64

11. 데이터프레임 합치기

[ ]:

df1 = pd.read_csv('/content/drive/MyDrive/KDT/5.데이터 분석/데이터/idol.csv')

df2 = pd.read_csv('/content/drive/MyDrive/KDT/5.데이터 분석/데이터/idol2.csv')

[ ]:

df_copy = df1.copy()

df_copy

df_copy.head()

[120]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048

[ ]:

df_concat = pd.concat([df1, df_copy]) #axis=0 (기본값)

df_concat

[121]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수012345678910111213141516171819012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587

[ ]:

# reset_index(): index를 새롭게 적용

# drop=True 옵션을 사용하여 기존 index가 컬럼으로 만들어지는 것을 방지

df_concat.reset_index(drop=True)

# df_concat

[126]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수0123456789101112131415161718192021222324252627282930313233343536373839

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587

[ ]:

pd.concat([df1, df2], axis = 1) # 같은 index와 결합

[127]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수이름연봉가족수012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 지민 3000 3
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 정국 3500 3
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 민지 3200 4
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 하니 3050 4
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 4300 3
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 다니엘 2900 5
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 혜인 3400 6
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 지수 4500 5
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 해린 4200 4
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 태연 4300 4
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 RM 3700 3
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 제니 3850 5
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 옹성우 3900 4
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 리사 4100 3
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 로제 4150 3
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 윤아 3000 3
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 조이 3500 3
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 슬기 3200 4
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 강다니엘 3050 4
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 4300 3

[ ]:

df3 = df2.drop([1, 3, 5, 7])

df3

[128]:

이름연봉가족수02468910111213141516171819

지민 3000 3
민지 3200 4
4300 3
혜인 3400 6
해린 4200 4
태연 4300 4
RM 3700 3
제니 3850 5
옹성우 3900 4
리사 4100 3
로제 4150 3
윤아 3000 3
조이 3500 3
슬기 3200 4
강다니엘 3050 4
4300 3

[ ]:

pd.concat([df1, df3], axis=1)

[129]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수이름연봉가족수012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 지민 3000.0 3.0
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 NaN NaN NaN
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 민지 3200.0 4.0
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 NaN NaN NaN
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 4300.0 3.0
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 NaN NaN NaN
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 혜인 3400.0 6.0
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 NaN NaN NaN
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 해린 4200.0 4.0
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 태연 4300.0 4.0
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 RM 3700.0 3.0
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 제니 3850.0 5.0
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 옹성우 3900.0 4.0
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 리사 4100.0 3.0
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 로제 4150.0 3.0
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 윤아 3000.0 3.0
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 조이 3500.0 3.0
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 슬기 3200.0 4.0
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 강다니엘 3050.0 4.0
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 4300.0 3.0

[ ]:

df_right = df2.drop([1, 3, 5, 7, 9], axis=0)

df_right

[130]:

이름연봉가족수0246810111213141516171819

지민 3000 3
민지 3200 4
4300 3
혜인 3400 6
해린 4200 4
RM 3700 3
제니 3850 5
옹성우 3900 4
리사 4100 3
로제 4150 3
윤아 3000 3
조이 3500 3
슬기 3200 4
강다니엘 3050 4
4300 3

[ ]:

df_right = df_right.reset_index(drop=True)

df_right

[131]:

이름연봉가족수01234567891011121314

지민 3000 3
민지 3200 4
4300 3
혜인 3400 6
해린 4200 4
RM 3700 3
제니 3850 5
옹성우 3900 4
리사 4100 3
로제 4150 3
윤아 3000 3
조이 3500 3
슬기 3200 4
강다니엘 3050 4
4300 3

[ ]:

# merge(): 특정 고유한 키(unique, id)값을 기준으로 합침

# merge(데이터프레임1, 데이터프레임2, on='유니크값', how='병합의 기준')

# 병합의 기준: left, right, inner, cross

pd.merge(df1, df_right, on='이름', how='left')

[132]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수연봉가족수012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 3000.0 3.0
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 NaN NaN
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 3200.0 4.0
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 NaN NaN
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 4300.0 3.0
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 NaN NaN
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 3400.0 6.0
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 NaN NaN
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 4200.0 4.0
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 NaN NaN
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 3700.0 3.0
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 3850.0 5.0
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 3900.0 4.0
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 4100.0 3.0
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 4150.0 3.0
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 3000.0 3.0
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 3500.0 3.0
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 3200.0 4.0
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 3050.0 4.0
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 4300.0 3.0

[ ]:

pd.merge(df1, df_right, on='이름', how='inner')

[133]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수연봉가족수01234567891011121314

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 3000 3
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 3200 4
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 4300 3
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 3400 6
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 4200 4
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 3700 3
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 3850 5
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 3900 4
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 4100 3
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 4150 3
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 3000 3
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 3500 3
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 3200 4
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 3050 4
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 4300 3

[ ]:

pd.merge(df1, df_right, how='cross')

[134]:

이름_x그룹소속사성별생년월일키혈액형브랜드평판지수이름_y연봉가족수01234...295296297298299

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 지민 3000 3
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 민지 3200 4
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 4300 3
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 혜인 3400 6
지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 해린 4200 4
... ... ... ... ... ... ... ... ... ... ...
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 윤아 3000 3
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 조이 3500 3
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 슬기 3200 4
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 강다니엘 3050 4
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 4300 3

300 rows × 11 columns

문제

  • df_right 데이터프레임에 아래와 같은 데이터를 추가하고 df1과 merge하여 출력
  • "이름: 김사과, 연봉 : 7000, 가족수 : 10 "
  • 단, how=right로 함

[ ]:

dic = { "이름":"김사과", "연봉":7000, "가족수":10 }

df_right = pd.concat([df_right, pd.DataFrame(dic, index=[0])], ignore_index=True)

df_right

[135]:

이름연봉가족수0123456789101112131415

지민 3000 3
민지 3200 4
4300 3
혜인 3400 6
해린 4200 4
RM 3700 3
제니 3850 5
옹성우 3900 4
리사 4100 3
로제 4150 3
윤아 3000 3
조이 3500 3
슬기 3200 4
강다니엘 3050 4
4300 3
김사과 7000 10

[ ]:

pd.merge(df1, df_right, how='right')

[136]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수연봉가족수0123456789101112131415

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302.0 3000 3
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081.0 3200 4
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048.0 4300 3
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785.0 3400 6
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376.0 4200 4
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499.0 3700 3
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250.0 3850 5
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327.0 3900 4
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800.0 4100 3
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132.0 4150 3
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297.0 3000 3
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514.0 3500 3
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767.0 3200 4
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444.0 3050 4
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587.0 4300 3
김사과 NaN NaN NaN NaN NaN NaN NaN 7000 10

[ ]:

df_right.columns = ['성함', '연봉', '가족수']

df_right

[137]:

성함연봉가족수0123456789101112131415

지민 3000 3
민지 3200 4
4300 3
혜인 3400 6
해린 4200 4
RM 3700 3
제니 3850 5
옹성우 3900 4
리사 4100 3
로제 4150 3
윤아 3000 3
조이 3500 3
슬기 3200 4
강다니엘 3050 4
4300 3
김사과 7000 10

[ ]:

# pd.merge(df1, df_right, on='이름', how='right') # KeyError : '이름'

pd.merge(df1, df_right, left_on='이름', right_on='성함', how='right')

[138]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수성함연봉가족수0123456789101112131415

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302.0 지민 3000 3
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081.0 민지 3200 4
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048.0 4300 3
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785.0 혜인 3400 6
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376.0 해린 4200 4
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499.0 RM 3700 3
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250.0 제니 3850 5
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327.0 옹성우 3900 4
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800.0 리사 4100 3
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132.0 로제 4150 3
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297.0 윤아 3000 3
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514.0 조이 3500 3
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767.0 슬기 3200 4
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444.0 강다니엘 3050 4
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587.0 4300 3
NaN NaN NaN NaN NaN NaN NaN NaN 김사과 7000 10

12. 등수 매기기

[ ]:

# rank(): 데이터프레임 또는 시리즈의 순위를 매기는 함수. 기본값은 ascending

df1['브랜드순위'] = df1['브랜드평판지수'].rank()

df1

[139]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수브랜드순위012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 20.0
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 19.0
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 18.0
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 17.0
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 16.0
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 15.0
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 14.0
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 13.0
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 12.0
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 11.0
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 10.0
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 9.0
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 8.0
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 7.0
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 6.0
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 5.0
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 4.0
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 3.0
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 2.0
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 1.0

[ ]:

df1['브랜드순위'] = df1['브랜드평판지수'].rank(ascending=False)

df1

[140]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수브랜드순위012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 1.0
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 2.0
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 3.0
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 4.0
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 5.0
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 6.0
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 7.0
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 8.0
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 9.0
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 10.0
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 11.0
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 12.0
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 13.0
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 14.0
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 15.0
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 16.0
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 17.0
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 18.0
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 19.0
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 20.0

[ ]:

# astype(): 특정열의 자료형을 변경

df1['브랜드순위'] = df1['브랜드순위'].astype(int)

df1

[141]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수브랜드순위012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 1
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 2
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 3
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 4
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 5
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 6
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 7
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 8
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 9
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 10
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 11
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 12
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 13
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 14
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 15
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 16
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 17
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 18
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 19
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 20

[ ]:

df1['브랜드순위'].dtypes # 데이터 타입 확인

[142]:

dtype('int64')

13. 날짜타입 사용하기

[ ]:

df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 21 entries, 0 to 20
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   name      21 non-null     object 
 1   group     21 non-null     object 
 2   company   20 non-null     object 
 3   gender    21 non-null     object 
 4   birthday  21 non-null     object 
 5   height    20 non-null     float64
 6   blood     20 non-null     object 
 7   brand     21 non-null     int64  
 8   nation    21 non-null     object 
dtypes: float64(1), int64(1), object(7)
memory usage: 1.6+ KB

[ ]:

df['birthday'] # 타입이 object라 연산이 불가

[144]:

0     1995-10-13
1     1997-09-01
2     2004-05-07
3     2004-10-06
4     1995-12-30
5     2005-04-11
6     2008-04-21
7     1995-01-03
8     2006-05-15
9     1989-03-09
10    1994-09-12
11    1996-01-16
12    1995-08-25
13    1997-03-27
14    1997-02-11
15    1990-05-30
16    1996-09-03
17    1994-02-10
18    1996-12-10
19    1992-12-04
20    2000-01-01
Name: birthday, dtype: object

[ ]:

# to_datetime(): object타입에서 datetime타입으로 변환

df['birthday'] = pd.to_datetime(df['birthday'])

df['birthday']

[145]:

0    1995-10-13
1    1997-09-01
2    2004-05-07
3    2004-10-06
4    1995-12-30
5    2005-04-11
6    2008-04-21
7    1995-01-03
8    2006-05-15
9    1989-03-09
10   1994-09-12
11   1996-01-16
12   1995-08-25
13   1997-03-27
14   1997-02-11
15   1990-05-30
16   1996-09-03
17   1994-02-10
18   1996-12-10
19   1992-12-04
20   2000-01-01
Name: birthday, dtype: datetime64[ns]

[ ]:

# 강사쌤 코멘트 : 상담하면서 많이 걱정하는 질문 - AI가 코딩 다해주는데 배우는게 의미가 있나요? 지금도 코딩 자동완성 해주는거 보면 잘하고 못하고 천차만별인데, 뭐, 먼 미래에는 다 할 수도 있겠지만

# 판단은 결국 개발자가 하니까, 그냥 생산성은 굉장히 높아지지만, 아직 사람이 해야할 일이 너무 많아서 나는 걱정안함. 그정도 기술력이면 어차피 모든 직업 사라짐 걱정 ㄴㄴ

# 지금까지 가르치면서 취업 못하는 애들은 없음 6개월 배워도 일단 취업은 됨, 근데 눈이 ㅈㄴ게 높아서 회사 1~2개 넣어놓고 기도박으면 당연히 안됨, 조건 최대한 줄이고 타협해서 보이는대로 입사지원 때려박아, 그정도는 해야 겨우 몇 개 연락온다

# ㅈ같은 회사도 면접 경험쌓는다 치고, 면접만 보고오셈 안가면 그만

# 돈버는게 아니라 경력 쌓는다 생각하고, 첫 회사 다녀

[ ]:

df['birthday'].dt.year # 연도만 출력

[146]:

0     1995
1     1997
2     2004
3     2004
4     1995
5     2005
6     2008
7     1995
8     2006
9     1989
10    1994
11    1996
12    1995
13    1997
14    1997
15    1990
16    1996
17    1994
18    1996
19    1992
20    2000
Name: birthday, dtype: int32

[ ]:

df['birthday'].dt.month # 월만 출력

[147]:

0     10
1      9
2      5
3     10
4     12
5      4
6      4
7      1
8      5
9      3
10     9
11     1
12     8
13     3
14     2
15     5
16     9
17     2
18    12
19    12
20     1
Name: birthday, dtype: int32

[ ]:

df['birthday'].dt.day # 일만 출력

[148]:

0     13
1      1
2      7
3      6
4     30
5     11
6     21
7      3
8     15
9      9
10    12
11    16
12    25
13    27
14    11
15    30
16     3
17    10
18    10
19     4
20     1
Name: birthday, dtype: int32

[ ]:

df['birthday'].dt.weekday # 요일 0(월요일) ~ 6(일요일)

[149]:

0     4
1     0
2     4
3     2
4     5
5     0
6     0
7     1
8     0
9     3
10    0
11    1
12    4
13    3
14    1
15    2
16    1
17    3
18    1
19    4
20    5
Name: birthday, dtype: int32

[ ]:

df['birthday'].dt.hour # 시간 , minute:분 / second : 초 다 됨, 기본값은 0

[150]:

0     0
1     0
2     0
3     0
4     0
5     0
6     0
7     0
8     0
9     0
10    0
11    0
12    0
13    0
14    0
15    0
16    0
17    0
18    0
19    0
20    0
Name: birthday, dtype: int32

[ ]:

df['birthday'].dt.isocalendar().week # 1년 중 몇 주차 한국에선 생소한데, 외국에선 자주 사용함

[151]:

0     41
1     36
2     19
3     41
4     52
5     15
6     17
7      1
8     20
9     10
10    37
11     3
12    34
13    13
14     7
15    22
16    36
17     6
18    50
19    49
20    52
Name: week, dtype: UInt32

14. apply 사용하기

  • Series나 DataFrame에 구체적인 로직을 적용하고 싶을 때 사용
  • apply를 적용하기 위해서는 별도의 함수를 먼저 정의해야 함
  • 작성된 함수를 apply에 매개변수로 전달함

[ ]:

df.head()

[152]:

namegroupcompanygenderbirthdayheightbloodbrandnation01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 대한민국
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 대한민국
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 대한민국
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 대한민국
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 대한민국

[ ]:

# 강사님 코멘트 : 딥러닝 마지막 단계는 무조건 모든 데이터를 숫자로 바꿔주는 작업을 해야함 0,1 위에 데이터의 성별이든 'name', 'gender'...든 결국 마지막엔 숫자로 바꿔야함

[ ]:

# 성별이 남자는 1, 여자는 0으로 변환 ( loc를 사용 )

df.loc[df['gender'] == '남자', 'gender'] = 1

df.loc[df['gender'] == '여자', 'gender'] = 0

df

[153]:

namegroupcompanygenderbirthdayheightbloodbrandnation01234567891011121314151617181920

지민 방탄소년단 빅히트 1 1995-10-13 174.0 A 6267302 대한민국
정국 방탄소년단 빅히트 1 1997-09-01 179.0 A 5805844 대한민국
민지 뉴진스 어도어 0 2004-05-07 169.0 A 4437081 대한민국
하니 뉴진스 어도어 0 2004-10-06 161.7 O 4161153 대한민국
방탄소년단 빅히트 1 1995-12-30 179.0 AB 3470048 대한민국
다니엘 뉴진스 어도어 0 2005-04-11 165.0 NaN 2341271 대한민국
혜인 뉴진스 어도어 0 2008-04-21 170.0 O 2301785 대한민국
지수 블랙핑크 와이지 0 1995-01-03 162.0 A 2227460 대한민국
해린 뉴진스 어도어 0 2006-05-15 164.5 B 2173376 대한민국
태연 소녀시대 에스엠 0 1989-03-09 NaN A 2079866 대한민국
RM 방탄소년단 빅히트 1 1994-09-12 181.0 A 2069499 대한민국
제니 블랙핑크 와이지 0 1996-01-16 163.0 B 2069250 대한민국
옹성우 워너원 판타지오 1 1995-08-25 179.0 A 1954327 대한민국
리사 블랙핑크 와이지 0 1997-03-27 167.0 A 1912800 대한민국
로제 블랙핑크 와이지 0 1997-02-11 168.0 B 1888132 대한민국
윤아 소녀시대 에스엠 0 1990-05-30 168.0 B 1885297 대한민국
조이 레드벨벳 빅히트 0 1996-09-03 168.0 A 1830514 대한민국
슬기 레드벨벳 빅히트 0 1994-02-10 161.0 A 1741767 대한민국
강다니엘 워너원 NaN 1 1996-12-10 182.0 A 1706444 대한민국
방탄소년단 빅히트 1 1992-12-04 179.0 O 1680587 대한민국
김사과 과수원 애플 0 2000-01-01 160.0 A 1234567 미국

[ ]:

df = pd.read_csv('/content/drive/MyDrive/KDT/5.데이터 분석/데이터/idol.csv')

df

[154]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587

[ ]:

# 함수로 만들기

def male_or_female(x):

if x == '남자':

return 1

elif x == '여자':

return 0

else:

return None

def blood_type(x):

if x == 'A':

return 0

elif x == 'B':

return 1

elif x == 'O':

return 2

else:

return 3

# else:

# return None

[ ]:

df['성별'].apply(male_or_female)

df['혈액형'].apply(blood_type)

[165]:

0     0
1     0
2     0
3     2
4     3
5     3
6     2
7     0
8     1
9     0
10    0
11    1
12    0
13    0
14    1
15    1
16    0
17    0
18    0
19    2
Name: 혈액형, dtype: int64

[ ]:

# lamda 함수로 바꾸기

df['성별'].apply( lambda x : 1 if x == '남자' else 0)

[158]:

0     1
1     1
2     0
3     0
4     1
5     0
6     0
7     0
8     0
9     0
10    1
11    0
12    1
13    0
14    0
15    0
16    0
17    0
18    1
19    1
Name: 성별, dtype: int64

[ ]:

df['New성별'] = df['성별'].apply(lambda x: 1 if x == '남자' else 0)

df.head()

[166]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수New성별01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 1
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 1
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 0
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 0
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 1

15. map 사용하기

  • 딕셔너리를 통해 데이터와 같은 키의 값을 적용

[ ]:

# 위에서 데이터 수정해서 다시 초기화

df = pd.read_csv('/content/drive/MyDrive/KDT/5.데이터 분석/데이터/idol.csv')

df.head()

[167]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048

[ ]:

map_gender = {'남자':1, '여자':0 }

[ ]:

df['성별'].map(map_gender)

[169]:

0     1
1     1
2     0
3     0
4     1
5     0
6     0
7     0
8     0
9     0
10    1
11    0
12    1
13    0
14    0
15    0
16    0
17    0
18    1
19    1
Name: 성별, dtype: int64

[ ]:

df['New성별'] = df['성별'].map(map_gender)

df.head()

[170]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수New성별01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 1
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 1
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 0
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 0
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 1

16. 데이터프레임의 산술연산

[ ]:

df = pd.DataFrame({

'파이썬' : [60, 70, 80, 86, 95],

'데이터분석' : [40, 60, 70, 55, 87],

'머신러닝딥러닝' : [35, 40, 30, 80, 55]

})

[ ]:

df

[173]:

파이썬데이터분석머신러닝딥러닝01234

60 40 35
70 60 40
80 70 30
86 55 80
95 87 55

[ ]:

df['파이썬'].dtypes

[174]:

dtype('int64')

[ ]:

type(df['파이썬'])

[175]:

pandas.core.series.Series
def __init__(data=None, index=None, dtype: Dtype | None=None, name=None, copy: bool | None=None, fastpath: bool=False) -> None
One-dimensional ndarray with axis labels (including time series).

Labels need not be unique but must be a hashable type. The object
supports both integer- and label-based indexing and provides a host of
methods for performing operations involving the index. Statistical
methods from ndarray have been overridden to automatically exclude
missing data (currently represented as NaN).

Operations between Series (+, -, /, \*, \*\*) align values based on their
associated index values-- they need not be the same length. The result
index will be the sorted union of the two indexes.

Parameters
----------
data : array-like, Iterable, dict, or scalar value
    Contains data stored in Series. If data is a dict, argument order is
    maintained.
index : array-like or Index (1d)
    Values must be hashable and have the same length as `data`.
    Non-unique index values are allowed. Will default to
    RangeIndex (0, 1, 2, ..., n) if not provided. If data is dict-like
    and index is None, then the keys in the data are used as the index. If the
    index is not None, the resulting Series is reindexed with the index values.
dtype : str, numpy.dtype, or ExtensionDtype, optional
    Data type for the output Series. If not specified, this will be
    inferred from `data`.
    See the :ref:`user guide <basics.dtypes>` for more usages.
name : Hashable, default None
    The name to give to the Series.
copy : bool, default False
    Copy input data. Only affects Series or 1d ndarray input. See examples.

Notes
-----
Please reference the :ref:`User Guide <basics.series>` for more information.

Examples
--------
Constructing Series from a dictionary with an Index specified

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> ser = pd.Series(data=d, index=['a', 'b', 'c'])
>>> ser
a   1
b   2
c   3
dtype: int64

The keys of the dictionary match with the Index values, hence the Index
values have no effect.

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> ser = pd.Series(data=d, index=['x', 'y', 'z'])
>>> ser
x   NaN
y   NaN
z   NaN
dtype: float64

Note that the Index is first build with the keys from the dictionary.
After this the Series is reindexed with the given Index values, hence we
get all NaN as a result.

Constructing Series from a list with `copy=False`.

>>> r = [1, 2]
>>> ser = pd.Series(r, copy=False)
>>> ser.iloc[0] = 999
>>> r
[1, 2]
>>> ser
0    999
1      2
dtype: int64

Due to input data type the Series has a `copy` of
the original data even though `copy=False`, so
the data is unchanged.

Constructing Series from a 1d ndarray with `copy=False`.

>>> r = np.array([1, 2])
>>> ser = pd.Series(r, copy=False)
>>> ser.iloc[0] = 999
>>> r
array([999,   2])
>>> ser
0    999
1      2
dtype: int64

Due to input data type the Series has a `view` on
the original data, so
the data is changed as well.

[ ]:

df['파이썬'] + df['데이터분석'] + df['머신러닝딥러닝']

[176]:

0    135
1    170
2    180
3    221
4    237
dtype: int64

[ ]:

# df에 총점, 평균이라는 파생변수를 만들고 파생변수에 총점, 평균을 구해서 저장

df['총점'] = df['파이썬'] + df['데이터분석'] + df['머신러닝딥러닝']

df['평균'] = df['총점'] / 3

df

[177]:

파이썬데이터분석머신러닝딥러닝총점평균01234

60 40 35 135 45.000000
70 60 40 170 56.666667
80 70 30 180 60.000000
86 55 80 221 73.666667
95 87 55 237 79.000000

[ ]:

df['파이썬'].sum() # df['파이썬'].sum(axis=0) 행으로 더함

[178]:

391

[ ]:

df['파이썬'].mean()

[179]:

78.2

[ ]:

df.sum()

[180]:

파이썬        391.000000
데이터분석      312.000000
머신러닝딥러닝    240.000000
총점         943.000000
평균         314.333333
dtype: float64

[ ]:

df.mean()

[181]:

파이썬         78.200000
데이터분석       62.400000
머신러닝딥러닝     48.000000
총점         188.600000
평균          62.866667
dtype: float64

[ ]:

df1 = pd.DataFrame({

'파이썬' : [60, 70, 80, 86, 95],

'데이터분석' : [40, 60, 70, 55, 87],

'머신러닝딥러닝' : [35, 40, 30, 80, 55]

})

df2 = pd.DataFrame({

'파이썬' : ['D', 'C', 'B', 'B', 'A'],

'데이터분석' : [40, 60, 70, 55, 87],

'머신러닝딥러닝' : [35, 40, 30, 80, 55]

})

[ ]:

# df1 + df2 # str이 섞여 있어서 안됨

df1 + 10 # 모든 데이터에 10씩 더함

# df2 + 10 # 문자열이 섞여 있어서 안됨

[183]:

파이썬데이터분석머신러닝딥러닝01234

70 50 45
80 70 50
90 80 40
96 65 90
105 97 65

[ ]:

df1 = pd.DataFrame({

'데이터분석' : [40, 60, 70, 55, 87],

'머신러닝딥러닝' : [35, 40, 30, 80, 55]

})

df2 = pd.DataFrame({

'데이터분석' : [40, 60, 70, 55],

'머신러닝딥러닝' : [35, 40, 30, 80]

})

[ ]:

df1 + df2 # 행의 갯수가 다른 경우는 빠진 데이터를 NaN 으로 취급해서 연산이 안됨

[185]:

데이터분석머신러닝딥러닝01234

80.0 70.0
120.0 80.0
140.0 60.0
110.0 160.0
NaN NaN

17. select_dtypes

[ ]:

# 위에서 데이터 수정해서 다시 초기화

df = pd.read_csv('/content/drive/MyDrive/KDT/5.데이터 분석/데이터/idol.csv')

df.head()

[186]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048

[ ]:

df.select_dtypes(include='object') # 문자열 컬럼만 가져오기

[187]:

이름그룹소속사성별생년월일혈액형012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 A
정국 방탄소년단 빅히트 남자 1997-09-01 A
민지 뉴진스 어도어 여자 2004-05-07 A
하니 뉴진스 어도어 여자 2004-10-06 O
방탄소년단 빅히트 남자 1995-12-30 AB
다니엘 뉴진스 어도어 여자 2005-04-11 NaN
혜인 뉴진스 어도어 여자 2008-04-21 O
지수 블랙핑크 와이지 여자 1995-01-03 A
해린 뉴진스 어도어 여자 2006-05-15 B
태연 소녀시대 에스엠 여자 1989-03-09 A
RM 방탄소년단 빅히트 남자 1994-09-12 A
제니 블랙핑크 와이지 여자 1996-01-16 B
옹성우 워너원 판타지오 남자 1995-08-25 A
리사 블랙핑크 와이지 여자 1997-03-27 A
로제 블랙핑크 와이지 여자 1997-02-11 B
윤아 소녀시대 에스엠 여자 1990-05-30 B
조이 레드벨벳 빅히트 여자 1996-09-03 A
슬기 레드벨벳 빅히트 여자 1994-02-10 A
강다니엘 워너원 NaN 남자 1996-12-10 A
방탄소년단 빅히트 남자 1992-12-04 O

[ ]:

df.select_dtypes(exclude='object') # 문자열 컬럼만 빼고 가져오기

[188]:

키브랜드평판지수012345678910111213141516171819

174.0 6267302
179.0 5805844
169.0 4437081
161.7 4161153
179.0 3470048
165.0 2341271
170.0 2301785
162.0 2227460
164.5 2173376
NaN 2079866
181.0 2069499
163.0 2069250
179.0 1954327
167.0 1912800
168.0 1888132
168.0 1885297
168.0 1830514
161.0 1741767
182.0 1706444
179.0 1680587

[ ]:

# 문자가 아닌 칼럼에만 10을 더함

df.select_dtypes(exclude='object') + 10

[189]:

키브랜드평판지수012345678910111213141516171819

184.0 6267312
189.0 5805854
179.0 4437091
171.7 4161163
189.0 3470058
175.0 2341281
180.0 2301795
172.0 2227470
174.5 2173386
NaN 2079876
191.0 2069509
173.0 2069260
189.0 1954337
177.0 1912810
178.0 1888142
178.0 1885307
178.0 1830524
171.0 1741777
192.0 1706454
189.0 1680597

문제

  • 문자열을 가지고 있는 컬럼의 이름만 저장하여 출력

[ ]:

str_cols = df.select_dtypes(include='object').columns

str_cols

[190]:

Index(['이름', '그룹', '소속사', '성별', '생년월일', '혈액형'], dtype='object')

18. 원 팟 인코딩(One Hot Encording)

  • 원 팟 인코딩은 한개의 요소는 1, 나머지 요소는 0으로 만들어 카테고리형을 표현하는 방법
  • 예) df['혈핵형']
    • 머신러닝/딥러닝 알고리즘에 넣어 데이터를 예측하려고 한다면 라벨 인코딩을 하여, 수치 데이터로 변환
    • 컴퓨터는 값들간의 관계를 스스로 형성하게 될 수 있음
    • 만약 B형은 1, AB형이 2라는 값을 가지고 있다면 컴퓨터는 'B형 + AB형 = O형'이라는 이상한 관계를 맺을 수 있음
    • 별도의 column들을 형성해주고, 1개의 column에는 1, 나머지 column에는 0으로 넣어줌으로 'A, B, AB, O'형의 관계는 서로 독립적이다'라는 카테고리로 표현하는 방식(원 핫 인코딩)

[ ]:

blood_map = {'A':0, 'B':1, 'AB':2, 'O':3}

df['혈액형_code'] = df['혈액형'].map(blood_map) # 라벨 인코딩 : 문자를 숫자로 바꾸기

df.head()

[191]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수혈액형_code01234

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 0.0
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 0.0
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 0.0
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 3.0
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 2.0

[ ]:

# get_dummies(): 원 팟 인코딩을 적용

pd.get_dummies(df['혈액형_code'])

[192]:

0.01.02.03.0012345678910111213141516171819

True False False False
True False False False
True False False False
False False False True
False False True False
False False False False
False False False True
True False False False
False True False False
True False False False
True False False False
False True False False
True False False False
True False False False
False True False False
False True False False
True False False False
True False False False
True False False False
False False False True

[ ]:

df = pd.get_dummies(df, columns=['혈액형_code'])

df

[193]:

이름그룹소속사성별생년월일키혈액형브랜드평판지수혈액형_code_0.0혈액형_code_1.0혈액형_code_2.0혈액형_code_3.0012345678910111213141516171819

지민 방탄소년단 빅히트 남자 1995-10-13 174.0 A 6267302 True False False False
정국 방탄소년단 빅히트 남자 1997-09-01 179.0 A 5805844 True False False False
민지 뉴진스 어도어 여자 2004-05-07 169.0 A 4437081 True False False False
하니 뉴진스 어도어 여자 2004-10-06 161.7 O 4161153 False False False True
방탄소년단 빅히트 남자 1995-12-30 179.0 AB 3470048 False False True False
다니엘 뉴진스 어도어 여자 2005-04-11 165.0 NaN 2341271 False False False False
혜인 뉴진스 어도어 여자 2008-04-21 170.0 O 2301785 False False False True
지수 블랙핑크 와이지 여자 1995-01-03 162.0 A 2227460 True False False False
해린 뉴진스 어도어 여자 2006-05-15 164.5 B 2173376 False True False False
태연 소녀시대 에스엠 여자 1989-03-09 NaN A 2079866 True False False False
RM 방탄소년단 빅히트 남자 1994-09-12 181.0 A 2069499 True False False False
제니 블랙핑크 와이지 여자 1996-01-16 163.0 B 2069250 False True False False
옹성우 워너원 판타지오 남자 1995-08-25 179.0 A 1954327 True False False False
리사 블랙핑크 와이지 여자 1997-03-27 167.0 A 1912800 True False False False
로제 블랙핑크 와이지 여자 1997-02-11 168.0 B 1888132 False True False False
윤아 소녀시대 에스엠 여자 1990-05-30 168.0 B 1885297 False True False False
조이 레드벨벳 빅히트 여자 1996-09-03 168.0 A 1830514 True False False False
슬기 레드벨벳 빅히트 여자 1994-02-10 161.0 A 1741767 True False False False
강다니엘 워너원 NaN 남자 1996-12-10 182.0 A 1706444 True False False False
방탄소년단 빅히트 남자 1992-12-04 179.0 O 1680587 False False False True

[ ]:

df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 12 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   이름            20 non-null     object 
 1   그룹            20 non-null     object 
 2   소속사           19 non-null     object 
 3   성별            20 non-null     object 
 4   생년월일          20 non-null     object 
 5   키             19 non-null     float64
 6   혈액형           19 non-null     object 
 7   브랜드평판지수       20 non-null     int64  
 8   혈액형_code_0.0  20 non-null     bool   
 9   혈액형_code_1.0  20 non-null     bool   
 10  혈액형_code_2.0  20 non-null     bool   
 11  혈액형_code_3.0  20 non-null     bool   
dtypes: bool(4), float64(1), int64(1), object(6)
memory usage: 1.5+ KB

[ ]:

'코딩 > 데이터 분석' 카테고리의 다른 글

전국 도시공원 데이터  (0) 2024.06.07
상권별 업종 밀집 통계 데이터  (0) 2024.06.07
가상 온라인 쇼핑몰 데이터  (1) 2024.06.07
Matplotlib  (1) 2024.06.07
넘파이(Numpy)  (1) 2024.06.07