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 |