250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- HTML
- JS
- CSS
- shutil
- fileinput
- fnmatch
- remove()
- View
- 오버라이딩
- discard()
- __len__
- node.js
- __getitem__
- mro()
- randrange()
- shuffle()
- MySqlDB
- decode()
- __annotations__
- inplace()
- Database
- __sub__
- zipfile
- items()
- glob
- MySQL
- choice()
- 파이썬
- locals()
- count()
Archives
- Today
- Total
흰둥이는 코드를 짤 때 짖어 (왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!)
(Python) 판다스 본문
728x90
반응형
1. 판다스(Pandas)
'웨스 맥키니'가 개발한 라이브러리. 데이터작업을 쉽고 직관적으로 할 수 있게 설계된 빠르고 유연한 데이터 구조(데이터프레임)를 제공하는 모듈.
1-1. Series와 DataFrame
- 2차원 표 데이터: 데이터프레임 = colums + index
- 1차원 표 데이터: 시리즈 = colums + index + values
- 표 데이터 부분: values
- 표 행 이름: index
- 표 열 이름: columns
- 데이터프레임, 시리즈: numpy의 ndarray 기반
In [ ]:
!pip install pandas
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (1.5.3)
Requirement already satisfied: python-dateutil>=2.8.1 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) (2022.7.1)
Requirement already satisfied: numpy>=1.21.0 in /usr/local/lib/python3.10/dist-packages (from pandas) (1.22.4)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas) (1.16.0)
In [ ]:
import pandas as pd
In [ ]:
# 데이터 만들기
data1 = [[67,93,91],
[75,69,96],
[75,81,82],
[62,70,75],
[98,45,87]]
In [ ]:
# 인덱스 만들기
idx1 = ['김사과', '반하나', '오렌지', '이메론', '배애리']
In [ ]:
# 행 만들기
col1 = ['국어','영어','수학']
In [ ]:
# List를 사용하여 데이터프레임 만들기
#DataFrame(데이터, 인덱스, 컬럼)으로 만들 수 있음.
pd.DataFrame(data1, idx1, col1)
Out[ ]:
국어 | 영어 | 수학 | |
---|---|---|---|
김사과 | 67 | 93 | 91 |
반하나 | 75 | 69 | 96 |
오렌지 | 75 | 81 | 82 |
이메론 | 62 | 70 | 75 |
배애리 | 98 | 45 | 87 |
In [ ]:
# 데이터프레임 내에서 파라미터를 통해 명시해줄 수 있음. → 굳이 순서를 맞출 필요 없음.
pd.DataFrame(data=data1, columns=col1)
Out[ ]:
국어 | 영어 | 수학 | |
---|---|---|---|
0 | 67 | 93 | 91 |
1 | 75 | 69 | 96 |
2 | 75 | 81 | 82 |
3 | 62 | 70 | 75 |
4 | 98 | 45 | 87 |
In [ ]:
df1 = pd.DataFrame(data1, idx1, col1)
In [ ]:
# 데이터프레임을 array로 출력
df1.values
Out[ ]:
array([[67, 93, 91],
[75, 69, 96],
[75, 81, 82],
[62, 70, 75],
[98, 45, 87]])
In [ ]:
df1.index
Out[ ]:
Index(['김사과', '반하나', '오렌지', '이메론', '배애리'], dtype='object')
In [ ]:
df1.columns
Out[ ]:
Index(['국어', '영어', '수학'], dtype='object')
In [ ]:
# 시리즈 만들기
data2 = [67, 75, 75, 62, 98]
In [ ]:
# Series(데이터, 인덱스)
pd.Series(data2)
Out[ ]:
0 67
1 75
2 75
3 62
4 98
dtype: int64
In [ ]:
pd.Series(data2, idx1)
Out[ ]:
김사과 67
반하나 75
오렌지 75
이메론 62
배애리 98
dtype: int64
In [ ]:
se1 = pd.Series(data2, idx1)
In [ ]:
se1.values
Out[ ]:
array([67, 75, 75, 62, 98])
In [ ]:
se1.index
Out[ ]:
Index(['김사과', '반하나', '오렌지', '이메론', '배애리'], dtype='object')
In [ ]:
# 딕셔너리를 사용하여 DataFrame 생성
dic1 = {
'국어':[67, 75, 75, 62, 98],
'영어':[93, 69, 81, 70, 45],
'수학':[91, 96, 82, 75, 87]
}
In [ ]:
df2 = pd.DataFrame(data=dic1, index=idx1)
In [ ]:
df2
Out[ ]:
국어 | 영어 | 수학 | |
---|---|---|---|
김사과 | 67 | 93 | 91 |
반하나 | 75 | 69 | 96 |
오렌지 | 75 | 81 | 82 |
이메론 | 62 | 70 | 75 |
배애리 | 98 | 45 | 87 |
In [ ]:
# csv파일, xlsx파일을 이용하여 DataFrame화 예제 실습
2. CSV 파일 다루기
- CSV
- Comma Seperaated Value의 약자로, 데이터를 쉼표로 구분한 파일.
- Excel로 로딩이 가능하지만 Excel파일과는 엄연히 다른 파일.
- 쉼표로 구분된 CSV가 Excel보다 더 가볍기 때문에 데이터로 많이 사용.
- 공공데이터 포털에서도 CSV 포맷의 파일을 제공中
In [ ]:
# pd.read_csv(CSV파일, 인코딩방법)
pd.read_csv('korean-idol.csv')
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
pd.read_csv('/content/drive/MyDrive/KDT/2. 데이터분석/korean-idol.csv')
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
pd.read_csv('http://bit.ly/ds-korean-idol')
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
3. Excel파일 읽어오기
In [ ]:
pd.read_excel('/content/drive/MyDrive/KDT/2. 데이터분석/korean-idol.xlsx')
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
4. DataFrame 기본정보 알아보기
In [ ]:
df = pd.read_csv('http://bit.ly/ds-korean-idol')
In [ ]:
df
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
type(df) # type이 DataFrame이다.
Out[ ]:
pandas.core.frame.DataFrame
In [ ]:
df.info() # info(): 기본적인 행(row), 열(column)의 정보를 보여줌
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 이름 15 non-null object
1 그룹 14 non-null object
2 소속사 15 non-null object
3 성별 15 non-null object
4 생년월일 15 non-null object
5 키 13 non-null float64
6 혈액형 15 non-null object
7 브랜드평판지수 15 non-null int64
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB
4-1. 열(column) 다루기
In [ ]:
df.columns
Out[ ]:
Index(['이름', '그룹', '소속사', '성별', '생년월일', '키', '혈액형', '브랜드평판지수'], dtype='object')
In [ ]:
new_columns = ['name', 'group', 'company', 'gender', 'birthday', 'height', 'blood', 'brand']
In [ ]:
df.columns = new_columns
In [ ]:
df
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
4-2. 통계정보 알아보기
In [ ]:
# describe(): 통계 정보를 출력
df.describe()
Out[ ]:
height | brand | |
---|---|---|
count | 13.000000 | 1.500000e+01 |
mean | 175.792308 | 5.655856e+06 |
std | 5.820576 | 2.539068e+06 |
min | 162.100000 | 2.925442e+06 |
25% | 174.000000 | 3.712344e+06 |
50% | 177.000000 | 4.668615e+06 |
75% | 179.200000 | 7.862214e+06 |
max | 183.000000 | 1.052326e+07 |
In [ ]:
df.describe(include=object)
Out[ ]:
name | group | company | gender | birthday | blood | |
---|---|---|---|---|---|---|
count | 15 | 14 | 15 | 15 | 15 | 15 |
unique | 15 | 8 | 9 | 2 | 15 | 4 |
top | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | A |
freq | 1 | 5 | 5 | 12 | 1 | 7 |
4-3. 형태(shape) 알아보기
In [ ]:
df.shape
Out[ ]:
(15, 8)
4-4. 원하는 개수의 데이터 보기
- head(): 상위 5개의 row 출력
- head(n): 상위 n개의 row 출력
- tail(): 하위 5개의 row 출력
- tail(n): 하위 n개의 row 출력
In [ ]:
df.head(7)
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
In [ ]:
df.tail()
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
4-5. 정렬하기
In [ ]:
# index로 오름차순 정렬
df.sort_index()
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
# index로 내림차순 정렬
df.sort_index(ascending=False)
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
In [ ]:
# 값에 따른 오름차순 정렬
df.sort_values(by='height')
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
In [ ]:
# 값에 따른 내림차순 정렬
df.sort_values(by='height', ascending=False)
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
In [ ]:
#NaN을 가장 위로 올리고 싶은 경우. na_position의 기본값은 last
df.sort_values(by='height', na_position='first')
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
In [ ]:
# 조건이 동일할 때, 두번째 조건을 설정하고 싶은 경우
# 1차 정렬: 키(내림차순), 2차 정렬: 브랜드(오름차순) // NaN도 맨 위로 올리고 싶은 경우
df.sort_values(by=['height', 'brand'], ascending=[False, True], na_position='first'); # 파이썬은 2개 이상인 경우 list를 사용.
5. 데이터 다루기
In [ ]:
df.head()
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
In [ ]:
# 혈액형만 뽑고 싶은 경우
print(df['blood']);
print(type(df['blood'])) # 해당 데이터 타입은 series이다.
0 A
1 A
2 A
3 AB
4 A
5 A
6 O
7 B
8 O
9 A
10 A
11 B
12 AB
13 O
14 O
Name: blood, dtype: object
<class 'pandas.core.series.Series'>
5-1. 범위 선택
In [ ]:
df.head(3)
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
In [ ]:
df[:3]
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
In [ ]:
# loc 인덱싱: 레이블(이름) 인덱싱. 행과 열 모두 인덱싱과 슬라이싱이 가능함.
df.loc[:, 'name'] # name만 모두 가져옴.
Out[ ]:
0 지민
1 지드래곤
2 강다니엘
3 뷔
4 화사
5 정국
6 민현
7 소연
8 진
9 하성운
10 태연
11 차은우
12 백호
13 JR
14 슈가
Name: name, dtype: object
In [ ]:
df.loc[2:5, 'name'] # index번호 2부터 '5'까지 모두 포함 (끝번호를 포함시킨다는 것을 꼭 기억하기)
Out[ ]:
2 강다니엘
3 뷔
4 화사
5 정국
Name: name, dtype: object
In [ ]:
df.loc[:,['name', 'gender', 'height']] #모든 행을 가져온 후, 특정 컬럼(name, gender, height)을 보고 싶은 경우. 여러개는 리스트를 사용.
Out[ ]:
name | gender | height | |
---|---|---|---|
0 | 지민 | 남자 | 173.6 |
1 | 지드래곤 | 남자 | 177.0 |
2 | 강다니엘 | 남자 | 180.0 |
3 | 뷔 | 남자 | 178.0 |
4 | 화사 | 여자 | 162.1 |
5 | 정국 | 남자 | 178.0 |
6 | 민현 | 남자 | 182.3 |
7 | 소연 | 여자 | NaN |
8 | 진 | 남자 | 179.2 |
9 | 하성운 | 남자 | 167.1 |
10 | 태연 | 여자 | NaN |
11 | 차은우 | 남자 | 183.0 |
12 | 백호 | 남자 | 175.0 |
13 | JR | 남자 | 176.0 |
14 | 슈가 | 남자 | 174.0 |
In [ ]:
df.loc[3:8, 'name':'gender'] # 3번부터 8번까지의 열을 name부터 gender까지 가져옴
Out[ ]:
name | group | company | gender | |
---|---|---|---|---|
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 |
4 | 화사 | 마마무 | RBW | 여자 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 |
7 | 소연 | 아이들 | 큐브 | 여자 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 |
In [ ]:
#iloc 인덱싱: index로 인덱싱, 행과 열 모두 인덱싱과 슬라이싱이 가능함.
df.iloc[:, [0,2]]
Out[ ]:
name | company | |
---|---|---|
0 | 지민 | 빅히트 |
1 | 지드래곤 | YG |
2 | 강다니엘 | 커넥트 |
3 | 뷔 | 빅히트 |
4 | 화사 | RBW |
5 | 정국 | 빅히트 |
6 | 민현 | 플레디스 |
7 | 소연 | 큐브 |
8 | 진 | 빅히트 |
9 | 하성운 | 스타크루이엔티 |
10 | 태연 | SM |
11 | 차은우 | 판타지오 |
12 | 백호 | 플레디스 |
13 | JR | 플레디스 |
14 | 슈가 | 빅히트 |
In [ ]:
df.iloc[:, 0:2] # index 2번 컬럼을 포함하지 않았음. (중요!)
Out[ ]:
name | group | |
---|---|---|
0 | 지민 | 방탄소년단 |
1 | 지드래곤 | 빅뱅 |
2 | 강다니엘 | NaN |
3 | 뷔 | 방탄소년단 |
4 | 화사 | 마마무 |
5 | 정국 | 방탄소년단 |
6 | 민현 | 뉴이스트 |
7 | 소연 | 아이들 |
8 | 진 | 방탄소년단 |
9 | 하성운 | 핫샷 |
10 | 태연 | 소녀시대 |
11 | 차은우 | 아스트로 |
12 | 백호 | 뉴이스트 |
13 | JR | 뉴이스트 |
14 | 슈가 | 방탄소년단 |
In [ ]:
df.iloc[1:3, 2:4] # row를 1부터 3직전, column을 2부터 4직전까지.
Out[ ]:
company | gender | |
---|---|---|
1 | YG | 남자 |
2 | 커넥트 | 남자 |
6. Boolean Indexing
조건, 비교연산을 넣으면 해당 결과가 t/f로 출력 특정 자료구조에 넣을 때 true만 뽑을 수 있음.
In [ ]:
df['height']>=180 # height가 180이상인 값을 True를 줌.
Out[ ]:
0 False
1 False
2 True
3 False
4 False
5 False
6 True
7 False
8 False
9 False
10 False
11 True
12 False
13 False
14 False
Name: height, dtype: bool
In [ ]:
df[df['height']>=180] # height가 180이상인 사람의 데이터는 true이고, true를 뽑아옴.
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
In [ ]:
# height가 180이상인 사람의 이름만 보고싶은 경우
df['name'][df['height']>=180]
Out[ ]:
2 강다니엘
6 민현
11 차은우
Name: name, dtype: object
In [ ]:
df[df['height']>=180]['name'] # 둘 다 표기 가능!
Out[ ]:
2 강다니엘
6 민현
11 차은우
Name: name, dtype: object
In [ ]:
# 행을 여러개를(name, gender, height) 뽑아서 보고 싶은 경우
df[['name', 'gender', 'height']][df['height']>=180]
Out[ ]:
name | gender | height | |
---|---|---|---|
2 | 강다니엘 | 남자 | 180.0 |
6 | 민현 | 남자 | 182.3 |
11 | 차은우 | 남자 | 183.0 |
In [ ]:
df
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
# 위의 내용을 loc로 만들어보기. loc[행의조건, 열의조건]
df.loc[df['height']>=180,['name', 'gender', 'height']]
Out[ ]:
name | gender | height | |
---|---|---|---|
2 | 강다니엘 | 남자 | 180.0 |
6 | 민현 | 남자 | 182.3 |
11 | 차은우 | 남자 | 183.0 |
7. isin
정의한 list에 있는 데이터를 색인하려는 경우 사용하는 함수. (조건을 걸어줄 값이 list안에 잇을 때 색인하는 방법)
In [ ]:
df
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
company = ['플레디스', 'SM']
In [ ]:
df['company'].isin(company) # 위에서 뽑은 company 2개가 df의 company에 있는지를 확인
Out[ ]:
0 False
1 False
2 False
3 False
4 False
5 False
6 True
7 False
8 False
9 False
10 True
11 False
12 True
13 True
14 False
Name: company, dtype: bool
In [ ]:
df[df['company'].isin(company) ] # T/F가 아니도록 뽑는 법.
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
In [ ]:
# loc를 이용해서 뽑는 법
df.loc[df['company'].isin(company),: ]
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
8. 결측값(Null, NaN)
Null: 비어있는 값, 결측값. pandas에서 NaN(Not a Number)로 표기된 값은 모두 결측값.
In [ ]:
df.info()
# df에서 결측값은 group과 height가 있음.
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 15 non-null object
1 group 14 non-null object
2 company 15 non-null object
3 gender 15 non-null object
4 birthday 15 non-null object
5 height 13 non-null float64
6 blood 15 non-null object
7 brand 15 non-null int64
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB
In [ ]:
df.isna() # 결측값을 t/f로 조회
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | False | False | False | False | False | False | False | False |
1 | False | False | False | False | False | False | False | False |
2 | False | True | False | False | False | False | False | False |
3 | False | False | False | False | False | False | False | False |
4 | False | False | False | False | False | False | False | False |
5 | False | False | False | False | False | False | False | False |
6 | False | False | False | False | False | False | False | False |
7 | False | False | False | False | False | True | False | False |
8 | False | False | False | False | False | False | False | False |
9 | False | False | False | False | False | False | False | False |
10 | False | False | False | False | False | True | False | False |
11 | False | False | False | False | False | False | False | False |
12 | False | False | False | False | False | False | False | False |
13 | False | False | False | False | False | False | False | False |
14 | False | False | False | False | False | False | False | False |
In [ ]:
df.isnull() # isna()와 동일함.
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | False | False | False | False | False | False | False | False |
1 | False | False | False | False | False | False | False | False |
2 | False | True | False | False | False | False | False | False |
3 | False | False | False | False | False | False | False | False |
4 | False | False | False | False | False | False | False | False |
5 | False | False | False | False | False | False | False | False |
6 | False | False | False | False | False | False | False | False |
7 | False | False | False | False | False | True | False | False |
8 | False | False | False | False | False | False | False | False |
9 | False | False | False | False | False | False | False | False |
10 | False | False | False | False | False | True | False | False |
11 | False | False | False | False | False | False | False | False |
12 | False | False | False | False | False | False | False | False |
13 | False | False | False | False | False | False | False | False |
14 | False | False | False | False | False | False | False | False |
In [ ]:
df['group'].isna() # group필드에 대해 결측값이 있는지의 여부를 확인
Out[ ]:
0 False
1 False
2 True
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 False
Name: group, dtype: bool
In [ ]:
df[df['group'].isna()] # 위의 결측값이 있는 데이터를 가져오고 싶은 경우
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
In [ ]:
df['name'][df['group'].isna()] # 데이터 중에서 이름만 가져오고 싶은 경우
Out[ ]:
2 강다니엘
Name: name, dtype: object
In [ ]:
df[df['group'].notnull()] # group중 null값이 아닌 사람만 출력 (강다니엘이 빠져있음)
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
# 그룹이 있는 연예인의 이름, 키, 혈액형 출력. (loc를 사용)
df.loc[df['group'].notnull(),['name','group','blood']]
Out[ ]:
name | group | blood | |
---|---|---|---|
0 | 지민 | 방탄소년단 | A |
1 | 지드래곤 | 빅뱅 | A |
3 | 뷔 | 방탄소년단 | AB |
4 | 화사 | 마마무 | A |
5 | 정국 | 방탄소년단 | A |
6 | 민현 | 뉴이스트 | O |
7 | 소연 | 아이들 | B |
8 | 진 | 방탄소년단 | O |
9 | 하성운 | 핫샷 | A |
10 | 태연 | 소녀시대 | A |
11 | 차은우 | 아스트로 | B |
12 | 백호 | 뉴이스트 | AB |
13 | JR | 뉴이스트 | O |
14 | 슈가 | 방탄소년단 | O |
In [ ]:
# NaN값이 포함된 height값을 출력
df['height']
Out[ ]:
0 173.6
1 177.0
2 180.0
3 178.0
4 162.1
5 178.0
6 182.3
7 NaN
8 179.2
9 167.1
10 NaN
11 183.0
12 175.0
13 176.0
14 174.0
Name: height, dtype: float64
In [ ]:
# fillna(): 결측값을 채워주는 함수. 굉장히 많이 사용되므로 숙지해두기.
# height의 NaN값을 0으로 대체.
df['height'].fillna(0)
Out[ ]:
0 173.6
1 177.0
2 180.0
3 178.0
4 162.1
5 178.0
6 182.3
7 0.0
8 179.2
9 167.1
10 0.0
11 183.0
12 175.0
13 176.0
14 174.0
Name: height, dtype: float64
In [ ]:
# inplace연산을 이용하여 NaN을 0으로 수정한 부분을 반영.
df['height'].fillna(0, inplace=True)
In [ ]:
# 정상적으로 수정이 반영된 것을 확인할 수 있음.
df
Out[ ]:
name | group | company | gender | birthday | height | blood | brand | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | 0.0 | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | 0.0 | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
# 데이터가 망가졌기 때문에, 데이터를 새로 받아옴.
df = pd.read_csv('http://bit.ly/ds-korean-idol')
In [ ]:
df
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
# df를 df2라는 파일로 복사
df2 = df.copy()
In [ ]:
df2
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
# 평균값: mean() 사용
height = df2['키'].mean()
In [ ]:
height
Out[ ]:
175.7923076923077
In [ ]:
df2['키'] = df2['키'].fillna(height)
In [ ]:
df2['키']
Out[ ]:
0 173.600000
1 177.000000
2 180.000000
3 178.000000
4 162.100000
5 178.000000
6 182.300000
7 175.792308
8 179.200000
9 167.100000
10 175.792308
11 183.000000
12 175.000000
13 176.000000
14 174.000000
Name: 키, dtype: float64
In [ ]:
df2=df.copy()
df2
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
# 존재하는 값 중 50% 위치의 값: median()
height = df2['키'].median()
height
Out[ ]:
177.0
In [ ]:
# 결측값이 있는 데이터 행을 삭제
# 결측값이 1개라도 있는 경우에도 행을 삭제
df.dropna()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
# 결측값이 있는 데이터 열을 삭제 (흔한 경우는 아님)
df.dropna(axis=1)
Out[ ]:
이름 | 소속사 | 성별 | 생년월일 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|
0 | 지민 | 빅히트 | 남자 | 1995-10-13 | A | 10523260 |
1 | 지드래곤 | YG | 남자 | 1988-08-18 | A | 9916947 |
2 | 강다니엘 | 커넥트 | 남자 | 1996-12-10 | A | 8273745 |
3 | 뷔 | 빅히트 | 남자 | 1995-12-30 | AB | 8073501 |
4 | 화사 | RBW | 여자 | 1995-07-23 | A | 7650928 |
5 | 정국 | 빅히트 | 남자 | 1997-09-01 | A | 5208335 |
6 | 민현 | 플레디스 | 남자 | 1995-08-09 | O | 4989792 |
7 | 소연 | 큐브 | 여자 | 1998-08-26 | B | 4668615 |
8 | 진 | 빅히트 | 남자 | 1992-12-04 | O | 4570308 |
9 | 하성운 | 스타크루이엔티 | 남자 | 1994-03-22 | A | 4036489 |
10 | 태연 | SM | 여자 | 1989-03-09 | A | 3918661 |
11 | 차은우 | 판타지오 | 남자 | 1997-03-30 | B | 3506027 |
12 | 백호 | 플레디스 | 남자 | 1995-07-21 | AB | 3301654 |
13 | JR | 플레디스 | 남자 | 1995-06-08 | O | 3274137 |
14 | 슈가 | 빅히트 | 남자 | 1993-03-09 | O | 2925442 |
9. 데이터 복사
In [ ]:
df
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
new_df = df
In [ ]:
new_df
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
new_df['이름'] = '김사과'
In [ ]:
new_df.head()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 김사과 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 김사과 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 김사과 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 김사과 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 김사과 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
In [ ]:
df
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 김사과 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 김사과 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 김사과 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 김사과 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 김사과 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 김사과 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 김사과 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 김사과 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 김사과 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 김사과 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 김사과 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 김사과 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 김사과 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | 김사과 | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 김사과 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
# 16진수 형태(hex)의 메모리 주소를 가리키는 id를 반환
print(hex(id(new_df)))
print(hex(id(df)))
0x7fe8d489c610
0x7fe8d489c610
In [ ]:
df = pd.read_csv('http://bit.ly/ds-korean-idol')
In [ ]:
copy_df = df.copy()
In [ ]:
print(hex(id(copy_df)))
print(hex(id(df)))
0x7fe8d474d630
0x7fe8d474d690
In [ ]:
copy_df['이름'] = '반하나'
In [ ]:
copy_df.head()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 반하나 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 반하나 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 반하나 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 반하나 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 반하나 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
In [ ]:
df.head()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
10. 행, 열 추가 및 삭제하기
10-1. 행 추가하기
- dict 형태의 데이터를 만들고, append() 함수를 사용하여 데이터를 추가함
- 반드시 ignore_index=True 옵션을 추가해야 에러가 발생하지 않음
In [ ]:
dic1 = {
'이름':'김사과',
'그룹':'애플',
'소속사':'apple',
'성별':'여자',
'생년월일':'2000-01-01',
'키':160,
'혈액형':'A',
'브랜드평판지수':987654321
}
df = df.append(dic1, ignore_index=True)
<ipython-input-127-f3ab664132e0>:11: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
df = df.append(dic1, ignore_index=True)
In [ ]:
df
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
15 | 김사과 | 애플 | apple | 여자 | 2000-01-01 | 160.0 | A | 987654321 |
10-2. 열 추가하기
In [ ]:
df['국적'] = '대한민국'
In [ ]:
df.tail()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 국적 | |
---|---|---|---|---|---|---|---|---|---|
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 대한민국 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 대한민국 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 대한민국 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 대한민국 |
15 | 김사과 | 애플 | apple | 여자 | 2000-01-01 | 160.0 | A | 987654321 | 대한민국 |
In [ ]:
# '김사과'의 국적을 '미국'으로 변경(단, loc를 사용하여 작성)
df.loc[df['이름'] == '김사과', '국적'] = '미국'
In [ ]:
df.tail()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 국적 | |
---|---|---|---|---|---|---|---|---|---|
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 대한민국 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 대한민국 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 대한민국 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 대한민국 |
15 | 김사과 | 애플 | apple | 여자 | 2000-01-01 | 160.0 | A | 987654321 | 미국 |
10-3. 열 삭제하기
In [ ]:
df.drop('그룹', axis=1)
Out[ ]:
이름 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 국적 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 대한민국 |
1 | 지드래곤 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 대한민국 |
2 | 강다니엘 | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 대한민국 |
3 | 뷔 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 대한민국 |
4 | 화사 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 대한민국 |
5 | 정국 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 대한민국 |
6 | 민현 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 대한민국 |
7 | 소연 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 대한민국 |
8 | 진 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 대한민국 |
9 | 하성운 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 대한민국 |
10 | 태연 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 대한민국 |
11 | 차은우 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 대한민국 |
12 | 백호 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 대한민국 |
13 | JR | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 대한민국 |
14 | 슈가 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 대한민국 |
15 | 김사과 | apple | 여자 | 2000-01-01 | 160.0 | A | 987654321 | 미국 |
In [ ]:
df.drop(['그룹', '소속사'], axis=1)
Out[ ]:
이름 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 국적 | |
---|---|---|---|---|---|---|---|
0 | 지민 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 대한민국 |
1 | 지드래곤 | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 대한민국 |
2 | 강다니엘 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 대한민국 |
3 | 뷔 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 대한민국 |
4 | 화사 | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 대한민국 |
5 | 정국 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 대한민국 |
6 | 민현 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 대한민국 |
7 | 소연 | 여자 | 1998-08-26 | NaN | B | 4668615 | 대한민국 |
8 | 진 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 대한민국 |
9 | 하성운 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 대한민국 |
10 | 태연 | 여자 | 1989-03-09 | NaN | A | 3918661 | 대한민국 |
11 | 차은우 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 대한민국 |
12 | 백호 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 대한민국 |
13 | JR | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 대한민국 |
14 | 슈가 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 대한민국 |
15 | 김사과 | 여자 | 2000-01-01 | 160.0 | A | 987654321 | 미국 |
10-4. 행 삭제하기
In [ ]:
df.drop(15, axis=0)
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 국적 | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 대한민국 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 대한민국 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 대한민국 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 대한민국 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 대한민국 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 대한민국 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 대한민국 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 대한민국 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 대한민국 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 대한민국 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 대한민국 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 대한민국 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 대한민국 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 대한민국 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 대한민국 |
In [ ]:
df.drop([1, 3, 5, 15], axis=0)
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 국적 | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 대한민국 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 대한민국 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 대한민국 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 대한민국 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 대한민국 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 대한민국 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 대한민국 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 대한민국 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 대한민국 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 대한민국 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 대한민국 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 대한민국 |
11. 통계값 다루기
In [ ]:
df.describe()
Out[ ]:
키 | 브랜드평판지수 | |
---|---|---|
count | 14.000000 | 1.600000e+01 |
mean | 174.664286 | 6.703076e+07 |
std | 7.006218 | 2.455119e+08 |
min | 160.000000 | 2.925442e+06 |
25% | 173.700000 | 3.815502e+06 |
50% | 176.500000 | 4.829204e+06 |
75% | 178.900000 | 8.123562e+06 |
max | 183.000000 | 9.876543e+08 |
In [ ]:
df['키'].sum()
Out[ ]:
2445.3
In [ ]:
df['키'].count() # count는 NaN를 포함하지 않음
Out[ ]:
14
In [ ]:
df['키'].mean()
Out[ ]:
174.66428571428574
In [ ]:
df['키'].max()
Out[ ]:
183.0
In [ ]:
df['키'].var() # 분산: 데이터가 평균으로부터 얼마나 떨어져 있는지 정도
# (데이터 - 평균) ** 2을 모두 더한 값 / 데이터의 갯수
Out[ ]:
49.08708791208794
In [ ]:
df['키'].std() # 표준편차: 분산에 루트를 씌움
Out[ ]:
7.0062178036432705
12. 그룹으로 묶기
In [ ]:
df
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 국적 | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 대한민국 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 대한민국 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 대한민국 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 대한민국 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 대한민국 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 대한민국 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 대한민국 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 대한민국 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 대한민국 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 대한민국 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 대한민국 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 대한민국 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 대한민국 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 대한민국 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 대한민국 |
15 | 김사과 | 애플 | apple | 여자 | 2000-01-01 | 160.0 | A | 987654321 | 미국 |
In [ ]:
# groupby: 데이터를 그룹으로 묶어 분석할 때 사용
df.groupby('소속사')
Out[ ]:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fe8d48afc70>
In [ ]:
df.groupby('소속사').count()
Out[ ]:
이름 | 그룹 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 국적 | |
---|---|---|---|---|---|---|---|---|
소속사 | ||||||||
RBW | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
SM | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
YG | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
apple | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
빅히트 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
스타크루이엔티 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
커넥트 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
큐브 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
판타지오 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
플레디스 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
In [ ]:
df.groupby('그룹').mean()
<ipython-input-151-77704ee27efa>:1: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
df.groupby('그룹').mean()
Out[ ]:
키 | 브랜드평판지수 | |
---|---|---|
그룹 | ||
뉴이스트 | 177.766667 | 3.855194e+06 |
마마무 | 162.100000 | 7.650928e+06 |
방탄소년단 | 176.560000 | 6.260169e+06 |
빅뱅 | 177.000000 | 9.916947e+06 |
소녀시대 | NaN | 3.918661e+06 |
아스트로 | 183.000000 | 3.506027e+06 |
아이들 | NaN | 4.668615e+06 |
애플 | 160.000000 | 9.876543e+08 |
핫샷 | 167.100000 | 4.036489e+06 |
In [ ]:
df.groupby('그룹').sum()
<ipython-input-150-9ca72e8e6547>:1: FutureWarning: The default value of numeric_only in DataFrameGroupBy.sum is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
df.groupby('그룹').sum()
Out[ ]:
키 | 브랜드평판지수 | |
---|---|---|
그룹 | ||
뉴이스트 | 533.3 | 11565583 |
마마무 | 162.1 | 7650928 |
방탄소년단 | 882.8 | 31300846 |
빅뱅 | 177.0 | 9916947 |
소녀시대 | 0.0 | 3918661 |
아스트로 | 183.0 | 3506027 |
아이들 | 0.0 | 4668615 |
애플 | 160.0 | 987654321 |
핫샷 | 167.1 | 4036489 |
In [ ]:
df.groupby('성별').mean()
<ipython-input-149-34fb6a0b8638>:1: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
df.groupby('성별').mean()
Out[ ]:
키 | 브랜드평판지수 | |
---|---|---|
성별 | ||
남자 | 176.933333 | 5.716636e+06 |
여자 | 161.050000 | 2.509731e+08 |
In [ ]:
# 혈액형별로 그룹을 맺어, 키의 평균값을 확인
df.groupby('혈액형')['키'].mean()
Out[ ]:
혈액형
A 171.114286
AB 176.500000
B 183.000000
O 177.875000
Name: 키, dtype: float64
In [ ]:
# 혈액형별로 그룹을 맺고, 성별로 또 그룹을 나눈 후, 키의 평균값을 확인
df.groupby(['혈액형', '성별'])['키'].mean()
Out[ ]:
혈액형 성별
A 남자 175.140
여자 161.050
AB 남자 176.500
B 남자 183.000
여자 NaN
O 남자 177.875
Name: 키, dtype: float64
13. 중복값 제거하기
In [ ]:
df['혈액형']
Out[ ]:
0 A
1 A
2 A
3 AB
4 A
5 A
6 O
7 B
8 O
9 A
10 A
11 B
12 AB
13 O
14 O
15 A
Name: 혈액형, dtype: object
In [ ]:
# drop_duplicates(): 중복된 데이터를 제거
df['혈액형'].drop_duplicates() # df['혈액형'].drop_duplicates(keep='first')
Out[ ]:
0 A
3 AB
6 O
7 B
Name: 혈액형, dtype: object
In [ ]:
df['혈액형'].drop_duplicates(keep='last')
Out[ ]:
11 B
12 AB
14 O
15 A
Name: 혈액형, dtype: object
In [ ]:
# value_counts(): 열의 각 값에 대한 데이터의 개수를 반환. NaN은 생략
df['그룹'].value_counts()
Out[ ]:
방탄소년단 5
뉴이스트 3
빅뱅 1
마마무 1
아이들 1
핫샷 1
소녀시대 1
아스트로 1
애플 1
Name: 그룹, dtype: int64
In [ ]:
df['그룹'].value_counts(dropna=False)
Out[ ]:
방탄소년단 5
뉴이스트 3
빅뱅 1
NaN 1
마마무 1
아이들 1
핫샷 1
소녀시대 1
아스트로 1
애플 1
Name: 그룹, dtype: int64
14. 데이터프레임 합치기
In [ ]:
df1 = pd.read_csv('http://bit.ly/ds-korean-idol')
df2 = pd.read_csv('https://bit.ly/ds-korean-idol-2')
In [ ]:
df1
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
df2
Out[ ]:
이름 | 연봉 | 가족수 | |
---|---|---|---|
0 | 지민 | 3000 | 3 |
1 | 지드래곤 | 3500 | 3 |
2 | 강다니엘 | 3200 | 4 |
3 | 뷔 | 3050 | 4 |
4 | 화사 | 4300 | 3 |
5 | 정국 | 2900 | 5 |
6 | 민현 | 3400 | 6 |
7 | 소연 | 4500 | 5 |
8 | 진 | 4200 | 4 |
9 | 하성운 | 4300 | 4 |
10 | 태연 | 3700 | 3 |
11 | 차은우 | 3850 | 5 |
12 | 백호 | 3900 | 4 |
13 | JR | 4100 | 3 |
14 | 슈가 | 4150 | 3 |
In [ ]:
df_copy = df1.copy()
In [ ]:
# concat(): 데이터를 합침. sort=False 옵션으로 순서가 유지되도록 함. axis=0이 생략
pd.concat([df1, df_copy], sort=False)
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
df_concat = pd.concat([df1, df_copy], sort=False)
In [ ]:
# reset_index(): index를 새롭게 적용. drop=True 옵션으로 기존 index를 삭제
df_concat.reset_index(drop=True)
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
15 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
16 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
17 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
18 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
19 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
20 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 |
21 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 |
22 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 |
23 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 |
24 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 |
25 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 |
26 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 |
27 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 |
28 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 |
29 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
pd.concat([df1, df2], axis=1) # 같은 index와 결합
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 이름 | 연봉 | 가족수 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 지민 | 3000 | 3 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 지드래곤 | 3500 | 3 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 강다니엘 | 3200 | 4 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 뷔 | 3050 | 4 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 화사 | 4300 | 3 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 정국 | 2900 | 5 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 민현 | 3400 | 6 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 소연 | 4500 | 5 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 진 | 4200 | 4 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 하성운 | 4300 | 4 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 태연 | 3700 | 3 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 차은우 | 3850 | 5 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 백호 | 3900 | 4 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | JR | 4100 | 3 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 슈가 | 4150 | 3 |
In [ ]:
df3 = df2.drop([3, 5])
df3
Out[ ]:
이름 | 연봉 | 가족수 | |
---|---|---|---|
0 | 지민 | 3000 | 3 |
1 | 지드래곤 | 3500 | 3 |
2 | 강다니엘 | 3200 | 4 |
4 | 화사 | 4300 | 3 |
6 | 민현 | 3400 | 6 |
7 | 소연 | 4500 | 5 |
8 | 진 | 4200 | 4 |
9 | 하성운 | 4300 | 4 |
10 | 태연 | 3700 | 3 |
11 | 차은우 | 3850 | 5 |
12 | 백호 | 3900 | 4 |
13 | JR | 4100 | 3 |
14 | 슈가 | 4150 | 3 |
In [ ]:
pd.concat([df1, df3], axis=1)
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 이름 | 연봉 | 가족수 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 지민 | 3000.0 | 3.0 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 지드래곤 | 3500.0 | 3.0 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 강다니엘 | 3200.0 | 4.0 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | NaN | NaN | NaN |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 화사 | 4300.0 | 3.0 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | NaN | NaN | NaN |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 민현 | 3400.0 | 6.0 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 소연 | 4500.0 | 5.0 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 진 | 4200.0 | 4.0 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 하성운 | 4300.0 | 4.0 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 태연 | 3700.0 | 3.0 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 차은우 | 3850.0 | 5.0 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 백호 | 3900.0 | 4.0 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | JR | 4100.0 | 3.0 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 슈가 | 4150.0 | 3.0 |
In [ ]:
df1 = pd.read_csv('http://bit.ly/ds-korean-idol')
df2 = pd.read_csv('https://bit.ly/ds-korean-idol-2')
In [ ]:
df_right = df2.drop([1, 3, 5, 7, 9], axis=0)
In [ ]:
df_right
Out[ ]:
이름 | 연봉 | 가족수 | |
---|---|---|---|
0 | 지민 | 3000 | 3 |
2 | 강다니엘 | 3200 | 4 |
4 | 화사 | 4300 | 3 |
6 | 민현 | 3400 | 6 |
8 | 진 | 4200 | 4 |
10 | 태연 | 3700 | 3 |
11 | 차은우 | 3850 | 5 |
12 | 백호 | 3900 | 4 |
13 | JR | 4100 | 3 |
14 | 슈가 | 4150 | 3 |
In [ ]:
df_right = df_right.reset_index(drop=True) # 인덱스 번호 새롭게 선언
In [ ]:
df_right
Out[ ]:
이름 | 연봉 | 가족수 | |
---|---|---|---|
0 | 지민 | 3000 | 3 |
1 | 강다니엘 | 3200 | 4 |
2 | 화사 | 4300 | 3 |
3 | 민현 | 3400 | 6 |
4 | 진 | 4200 | 4 |
5 | 태연 | 3700 | 3 |
6 | 차은우 | 3850 | 5 |
7 | 백호 | 3900 | 4 |
8 | JR | 4100 | 3 |
9 | 슈가 | 4150 | 3 |
In [ ]:
pd.concat([df1, df_right], axis=1)
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 이름 | 연봉 | 가족수 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 지민 | 3000.0 | 3.0 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 강다니엘 | 3200.0 | 4.0 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 화사 | 4300.0 | 3.0 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 민현 | 3400.0 | 6.0 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 진 | 4200.0 | 4.0 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 태연 | 3700.0 | 3.0 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 차은우 | 3850.0 | 5.0 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 백호 | 3900.0 | 4.0 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | JR | 4100.0 | 3.0 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 슈가 | 4150.0 | 3.0 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | NaN | NaN | NaN |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | NaN | NaN | NaN |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | NaN | NaN | NaN |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | NaN | NaN | NaN |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | NaN | NaN | NaN |
In [ ]:
# merge(): 특정 고유한 키(unique, id)값을 기준으로 합침
# merge(데이터프레임1, 데이터프레임2, on='유니크한 값', how='병합의 기준')
# 병합의 기준: left, right, inner
pd.merge(df1, df_right, on='이름', how='left')
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 연봉 | 가족수 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 3000.0 | 3.0 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | NaN | NaN |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 3200.0 | 4.0 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | NaN | NaN |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 4300.0 | 3.0 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | NaN | NaN |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 3400.0 | 6.0 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | NaN | NaN |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 4200.0 | 4.0 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | NaN | NaN |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 3700.0 | 3.0 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 3850.0 | 5.0 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 3900.0 | 4.0 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 4100.0 | 3.0 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 4150.0 | 3.0 |
In [ ]:
pd.merge(df1, df_right, on='이름', how='inner')
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 연봉 | 가족수 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 3000 | 3 |
1 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 3200 | 4 |
2 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 4300 | 3 |
3 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 3400 | 6 |
4 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 4200 | 4 |
5 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 3700 | 3 |
6 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 3850 | 5 |
7 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 3900 | 4 |
8 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 4100 | 3 |
9 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 4150 | 3 |
In [ ]:
df_right = df_right.append({'이름':'김사과', '연봉':5000, '가족수':5}, ignore_index=True)
<ipython-input-183-0e3f56442356>:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
df_right = df_right.append({'이름':'김사과', '연봉':5000, '가족수':5}, ignore_index=True)
In [ ]:
df_right
Out[ ]:
이름 | 연봉 | 가족수 | |
---|---|---|---|
0 | 지민 | 3000 | 3 |
1 | 강다니엘 | 3200 | 4 |
2 | 화사 | 4300 | 3 |
3 | 민현 | 3400 | 6 |
4 | 진 | 4200 | 4 |
5 | 태연 | 3700 | 3 |
6 | 차은우 | 3850 | 5 |
7 | 백호 | 3900 | 4 |
8 | JR | 4100 | 3 |
9 | 슈가 | 4150 | 3 |
10 | 김사과 | 5000 | 5 |
In [ ]:
pd.merge(df1, df_right, on='이름', how='right')
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 연봉 | 가족수 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260.0 | 3000 | 3 |
1 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745.0 | 3200 | 4 |
2 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928.0 | 4300 | 3 |
3 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792.0 | 3400 | 6 |
4 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308.0 | 4200 | 4 |
5 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661.0 | 3700 | 3 |
6 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027.0 | 3850 | 5 |
7 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654.0 | 3900 | 4 |
8 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137.0 | 4100 | 3 |
9 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442.0 | 4150 | 3 |
10 | 김사과 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5000 | 5 |
In [ ]:
df_right
Out[ ]:
이름 | 연봉 | 가족수 | |
---|---|---|---|
0 | 지민 | 3000 | 3 |
1 | 강다니엘 | 3200 | 4 |
2 | 화사 | 4300 | 3 |
3 | 민현 | 3400 | 6 |
4 | 진 | 4200 | 4 |
5 | 태연 | 3700 | 3 |
6 | 차은우 | 3850 | 5 |
7 | 백호 | 3900 | 4 |
8 | JR | 4100 | 3 |
9 | 슈가 | 4150 | 3 |
10 | 김사과 | 5000 | 5 |
In [ ]:
df_right.columns = ['성함', '연봉', '가족수']
In [ ]:
df_right
Out[ ]:
성함 | 연봉 | 가족수 | |
---|---|---|---|
0 | 지민 | 3000 | 3 |
1 | 강다니엘 | 3200 | 4 |
2 | 화사 | 4300 | 3 |
3 | 민현 | 3400 | 6 |
4 | 진 | 4200 | 4 |
5 | 태연 | 3700 | 3 |
6 | 차은우 | 3850 | 5 |
7 | 백호 | 3900 | 4 |
8 | JR | 4100 | 3 |
9 | 슈가 | 4150 | 3 |
10 | 김사과 | 5000 | 5 |
In [ ]:
pd.merge(df1, df_right, on='이름', how='left')
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-195-57b719b81580> in <cell line: 1>()
----> 1 pd.merge(df1, df_right, on='이름', how='left')
/usr/local/lib/python3.10/dist-packages/pandas/core/reshape/merge.py in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)
108 validate: str | None = None,
109 ) -> DataFrame:
--> 110 op = _MergeOperation(
111 left,
112 right,
/usr/local/lib/python3.10/dist-packages/pandas/core/reshape/merge.py in __init__(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, indicator, validate)
701 self.right_join_keys,
702 self.join_names,
--> 703 ) = self._get_merge_keys()
704
705 # validate the merge keys dtypes. We may need to coerce
/usr/local/lib/python3.10/dist-packages/pandas/core/reshape/merge.py in _get_merge_keys(self)
1160 rk = cast(Hashable, rk)
1161 if rk is not None:
-> 1162 right_keys.append(right._get_label_or_level_values(rk))
1163 else:
1164 # work-around for merge_asof(right_index=True)
/usr/local/lib/python3.10/dist-packages/pandas/core/generic.py in _get_label_or_level_values(self, key, axis)
1848 )
1849 else:
-> 1850 raise KeyError(key)
1851
1852 # Check for duplicates
KeyError: '이름'
In [ ]:
pd.merge(df1, df_right, left_on='이름', right_on='성함', how='left')
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 성함 | 연봉 | 가족수 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 지민 | 3000.0 | 3.0 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | NaN | NaN | NaN |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 강다니엘 | 3200.0 | 4.0 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | NaN | NaN | NaN |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 화사 | 4300.0 | 3.0 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | NaN | NaN | NaN |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 민현 | 3400.0 | 6.0 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | NaN | NaN | NaN |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 진 | 4200.0 | 4.0 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | NaN | NaN | NaN |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 태연 | 3700.0 | 3.0 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 차은우 | 3850.0 | 5.0 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 백호 | 3900.0 | 4.0 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | JR | 4100.0 | 3.0 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 슈가 | 4150.0 | 3.0 |
15. 등수 매기기
In [ ]:
# rank(): 데이터프레임 또는 시리즈의 순위를 매기는 함수. 기본값은 ascending
df1['브랜드순위'] = df1['브랜드평판지수'].rank()
In [ ]:
df1
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 브랜드순위 | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 15.0 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 14.0 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 13.0 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 12.0 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 11.0 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 10.0 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 9.0 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 8.0 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 7.0 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 6.0 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 5.0 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 4.0 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 3.0 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 2.0 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 1.0 |
In [ ]:
df1['브랜드순위'] = df1['브랜드평판지수'].rank(ascending=False)
df1
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 브랜드순위 | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 1.0 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 2.0 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 3.0 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 4.0 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 5.0 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 6.0 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 7.0 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 8.0 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 9.0 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 10.0 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 11.0 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 12.0 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 13.0 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 14.0 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 15.0 |
In [ ]:
# astype(): 특정열의 자료형을 변경
df1['브랜드순위'] = df1['브랜드순위'].astype(int)
df1
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 브랜드순위 | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 1 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 2 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 3 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 4 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 5 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 6 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 7 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 8 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 9 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 10 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 11 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 12 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 13 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 14 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 15 |
In [ ]:
df1['브랜드순위'].dtypes
Out[ ]:
dtype('int64')
16. 날짜타입 사용하기
In [ ]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16 entries, 0 to 15
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 이름 16 non-null object
1 그룹 15 non-null object
2 소속사 16 non-null object
3 성별 16 non-null object
4 생년월일 16 non-null object
5 키 14 non-null float64
6 혈액형 16 non-null object
7 브랜드평판지수 16 non-null int64
8 국적 16 non-null object
dtypes: float64(1), int64(1), object(7)
memory usage: 1.2+ KB
In [ ]:
df['생년월일']
Out[ ]:
0 1995-10-13
1 1988-08-18
2 1996-12-10
3 1995-12-30
4 1995-07-23
5 1997-09-01
6 1995-08-09
7 1998-08-26
8 1992-12-04
9 1994-03-22
10 1989-03-09
11 1997-03-30
12 1995-07-21
13 1995-06-08
14 1993-03-09
15 2000-01-01
Name: 생년월일, dtype: object
In [ ]:
# to_datetime(): object 타입에서 datetime 타입으로 변환
df['생년월일'] = pd.to_datetime(df['생년월일'])
In [ ]:
df['생년월일']
Out[ ]:
0 1995-10-13
1 1988-08-18
2 1996-12-10
3 1995-12-30
4 1995-07-23
5 1997-09-01
6 1995-08-09
7 1998-08-26
8 1992-12-04
9 1994-03-22
10 1989-03-09
11 1997-03-30
12 1995-07-21
13 1995-06-08
14 1993-03-09
15 2000-01-01
Name: 생년월일, dtype: datetime64[ns]
In [ ]:
df['생년월일'].dt.year
Out[ ]:
0 1995
1 1988
2 1996
3 1995
4 1995
5 1997
6 1995
7 1998
8 1992
9 1994
10 1989
11 1997
12 1995
13 1995
14 1993
15 2000
Name: 생년월일, dtype: int64
In [ ]:
df['생년월일'].dt.month
Out[ ]:
0 10
1 8
2 12
3 12
4 7
5 9
6 8
7 8
8 12
9 3
10 3
11 3
12 7
13 6
14 3
15 1
Name: 생년월일, dtype: int64
In [ ]:
df['생년월일'].dt.day
Out[ ]:
0 13
1 18
2 10
3 30
4 23
5 1
6 9
7 26
8 4
9 22
10 9
11 30
12 21
13 8
14 9
15 1
Name: 생년월일, dtype: int64
In [ ]:
df['생년월일'].dt.hour
Out[ ]:
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
Name: 생년월일, dtype: int64
In [ ]:
df['생년월일'].dt.minute
Out[ ]:
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
Name: 생년월일, dtype: int64
In [ ]:
df['생년월일'].dt.second
Out[ ]:
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
Name: 생년월일, dtype: int64
In [ ]:
df['생년월일'].dt.dayofweek # 요일: 0(월요일) ~ 6(일요일)
Out[ ]:
0 4
1 3
2 1
3 5
4 6
5 0
6 2
7 2
8 4
9 1
10 3
11 6
12 4
13 3
14 1
15 5
Name: 생년월일, dtype: int64
In [ ]:
df['생년월일'].dt.isocalendar().week
Out[ ]:
0 41
1 33
2 50
3 52
4 29
5 36
6 32
7 35
8 49
9 12
10 10
11 13
12 29
13 23
14 10
15 52
Name: week, dtype: UInt32
17. apply
- Series나 DataFrame에 구체적인 로직을 적용하고 싶을 때 사용
- apply를 적용하기 위해서는 별도의 함수가 먼저 정의되야 함
- 먼저 작성된 함수를 apply에 매개변수로 전달함
In [ ]:
df = pd.read_csv('http://bit.ly/ds-korean-idol')
In [ ]:
df.head()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
In [ ]:
# 성별이 남자는 1, 여자는 0으로 변환(loc를 사용)
df.loc[df['성별'] == '남자', '성별'] = 1
df.loc[df['성별'] == '여자', '성별'] = 0
In [ ]:
df
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 1 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 1 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 1 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 1 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 0 | 1995-07-23 | 162.1 | A | 7650928 |
5 | 정국 | 방탄소년단 | 빅히트 | 1 | 1997-09-01 | 178.0 | A | 5208335 |
6 | 민현 | 뉴이스트 | 플레디스 | 1 | 1995-08-09 | 182.3 | O | 4989792 |
7 | 소연 | 아이들 | 큐브 | 0 | 1998-08-26 | NaN | B | 4668615 |
8 | 진 | 방탄소년단 | 빅히트 | 1 | 1992-12-04 | 179.2 | O | 4570308 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 1 | 1994-03-22 | 167.1 | A | 4036489 |
10 | 태연 | 소녀시대 | SM | 0 | 1989-03-09 | NaN | A | 3918661 |
11 | 차은우 | 아스트로 | 판타지오 | 1 | 1997-03-30 | 183.0 | B | 3506027 |
12 | 백호 | 뉴이스트 | 플레디스 | 1 | 1995-07-21 | 175.0 | AB | 3301654 |
13 | JR | 뉴이스트 | 플레디스 | 1 | 1995-06-08 | 176.0 | O | 3274137 |
14 | 슈가 | 방탄소년단 | 빅히트 | 1 | 1993-03-09 | 174.0 | O | 2925442 |
In [ ]:
df = pd.read_csv('http://bit.ly/ds-korean-idol')
In [ ]:
def male_or_female(x):
if x == '남자':
return 1
elif x == '여자':
return 0
In [ ]:
df['성별'].apply(male_or_female)
Out[ ]:
0 1
1 1
2 1
3 1
4 0
5 1
6 1
7 0
8 1
9 1
10 0
11 1
12 1
13 1
14 1
Name: 성별, dtype: int64
In [ ]:
df['성별'].apply(lambda x: 1 if x == '남자' else 0)
Out[ ]:
0 1
1 1
2 1
3 1
4 0
5 1
6 1
7 0
8 1
9 1
10 0
11 1
12 1
13 1
14 1
Name: 성별, dtype: int64
In [ ]:
df['New성별'] = df['성별'].apply(lambda x: 1 if x == '남자' else 0)
In [ ]:
df.head()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | New성별 | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 1 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 1 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 1 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 1 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 0 |
18. map
- 딕셔너리를 통해 데이터와 같은 키의 값을 적용
In [ ]:
df = pd.read_csv('http://bit.ly/ds-korean-idol')
In [ ]:
df.head()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
In [ ]:
map_gender = {'남자':1, '여자':0}
In [ ]:
df['성별'].map(map_gender)
Out[ ]:
0 1
1 1
2 1
3 1
4 0
5 1
6 1
7 0
8 1
9 1
10 0
11 1
12 1
13 1
14 1
Name: 성별, dtype: int64
In [ ]:
df['New성별'] = df['성별'].map(map_gender)
df.head()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | New성별 | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 1 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 1 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 1 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 1 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 0 |
19. 데이터프레임의 산술연산
In [ ]:
df = pd.DataFrame({
'파이썬':[60, 70, 80, 86, 95],
'데이터분석':[40, 60, 70, 55, 88],
'머신러닝딥러닝':[90, 40, 30, 100, 55]
})
df
Out[ ]:
파이썬 | 데이터분석 | 머신러닝딥러닝 | |
---|---|---|---|
0 | 60 | 40 | 90 |
1 | 70 | 60 | 40 |
2 | 80 | 70 | 30 |
3 | 86 | 55 | 100 |
4 | 95 | 88 | 55 |
In [ ]:
type(df['파이썬'])
Out[ ]:
pandas.core.series.Series
In [ ]:
df['파이썬'] + df['데이터분석'] + df['머신러닝딥러닝']
Out[ ]:
0 190
1 170
2 180
3 241
4 238
dtype: int64
In [ ]:
df['총점'] = df['파이썬'] + df['데이터분석'] + df['머신러닝딥러닝']
df
Out[ ]:
파이썬 | 데이터분석 | 머신러닝딥러닝 | 총점 | |
---|---|---|---|---|
0 | 60 | 40 | 90 | 190 |
1 | 70 | 60 | 40 | 170 |
2 | 80 | 70 | 30 | 180 |
3 | 86 | 55 | 100 | 241 |
4 | 95 | 88 | 55 | 238 |
In [ ]:
df['평균'] = df['총점'] / 3
df
Out[ ]:
파이썬 | 데이터분석 | 머신러닝딥러닝 | 총점 | 평균 | |
---|---|---|---|---|---|
0 | 60 | 40 | 90 | 190 | 63.333333 |
1 | 70 | 60 | 40 | 170 | 56.666667 |
2 | 80 | 70 | 30 | 180 | 60.000000 |
3 | 86 | 55 | 100 | 241 | 80.333333 |
4 | 95 | 88 | 55 | 238 | 79.333333 |
In [ ]:
df['파이썬'].sum() # df['파이썬'].sum(axis=0)
Out[ ]:
391
In [ ]:
df['파이썬'].mean()
Out[ ]:
78.2
In [ ]:
df.mean()
Out[ ]:
파이썬 78.200000
데이터분석 62.600000
머신러닝딥러닝 63.000000
총점 203.800000
평균 67.933333
dtype: float64
In [ ]:
df1 = pd.DataFrame({
'파이썬':[60, 70, 80, 86, 95],
'데이터분석':[40, 60, 70, 55, 88],
'머신러닝딥러닝':[90, 40, 30, 100, 55]
})
df2 = pd.DataFrame({
'파이썬':['C', 'A', 'B', 'B', 'C'],
'데이터분석':[40, 60, 70, 55, 88],
'머신러닝딥러닝':[90, 40, 30, 100, 55]
})
In [ ]:
df1 + df2
TypeError: unsupported operand type(s) for +: 'int' and 'str'
In [ ]:
df1 + 10
Out[ ]:
파이썬 | 데이터분석 | 머신러닝딥러닝 | |
---|---|---|---|
0 | 70 | 50 | 100 |
1 | 80 | 70 | 50 |
2 | 90 | 80 | 40 |
3 | 96 | 65 | 110 |
4 | 105 | 98 | 65 |
In [ ]:
df2 + 10
TypeError: can only concatenate str (not "int") to str
In [ ]:
df1 = pd.DataFrame({
'데이터분석':[40, 60, 70, 55, 88],
'머신러닝딥러닝':[90, 40, 30, 100, 55]
})
df2 = pd.DataFrame({
'데이터분석':[40, 60, 70, 55],
'머신러닝딥러닝':[90, 40, 30, 100]
})
In [ ]:
df1 + df2 # 행의 개수가 다를 경우 빠진 데이터를 NaN으로 취급하기 때문에 연산이 되지 않음
Out[ ]:
데이터분석 | 머신러닝딥러닝 | |
---|---|---|
0 | 80.0 | 180.0 |
1 | 120.0 | 80.0 |
2 | 140.0 | 60.0 |
3 | 110.0 | 200.0 |
4 | NaN | NaN |
20. select_dtypes
In [ ]:
df = pd.read_csv('http://bit.ly/ds-korean-idol')
In [ ]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 이름 15 non-null object
1 그룹 14 non-null object
2 소속사 15 non-null object
3 성별 15 non-null object
4 생년월일 15 non-null object
5 키 13 non-null float64
6 혈액형 15 non-null object
7 브랜드평판지수 15 non-null int64
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB
In [ ]:
df.select_dtypes(include='object') # 문자열 컬럼만 가져오기
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 혈액형 | |
---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | A |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | A |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | A |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | AB |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | A |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | A |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | O |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | B |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | O |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | A |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | A |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | B |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | AB |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | O |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | O |
In [ ]:
df.select_dtypes(exclude='object') # 문자열 컬럼만 빼고 가져오기
Out[ ]:
키 | 브랜드평판지수 | |
---|---|---|
0 | 173.6 | 10523260 |
1 | 177.0 | 9916947 |
2 | 180.0 | 8273745 |
3 | 178.0 | 8073501 |
4 | 162.1 | 7650928 |
5 | 178.0 | 5208335 |
6 | 182.3 | 4989792 |
7 | NaN | 4668615 |
8 | 179.2 | 4570308 |
9 | 167.1 | 4036489 |
10 | NaN | 3918661 |
11 | 183.0 | 3506027 |
12 | 175.0 | 3301654 |
13 | 176.0 | 3274137 |
14 | 174.0 | 2925442 |
In [ ]:
# 문자가 아닌 컬럼에만 10을 더함
df.select_dtypes(exclude='object') + 10
Out[ ]:
키 | 브랜드평판지수 | |
---|---|---|
0 | 183.6 | 10523270 |
1 | 187.0 | 9916957 |
2 | 190.0 | 8273755 |
3 | 188.0 | 8073511 |
4 | 172.1 | 7650938 |
5 | 188.0 | 5208345 |
6 | 192.3 | 4989802 |
7 | NaN | 4668625 |
8 | 189.2 | 4570318 |
9 | 177.1 | 4036499 |
10 | NaN | 3918671 |
11 | 193.0 | 3506037 |
12 | 185.0 | 3301664 |
13 | 186.0 | 3274147 |
14 | 184.0 | 2925452 |
In [ ]:
# 문자열을 가지고 있는 컬럼만 저장
str_cols = df.select_dtypes(include='object').columns
In [ ]:
str_cols
Out[ ]:
Index(['이름', '그룹', '소속사', '성별', '생년월일', '혈액형'], dtype='object')
In [ ]:
df[str_cols]
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 혈액형 | |
---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | A |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | A |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | A |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | AB |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | A |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | A |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | O |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | B |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | O |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | A |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | A |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | B |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | AB |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | O |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | O |
21. 원 핫 인코딩(One Hot Encoding)
- 더미변수
- 원 핫 인코딩은 한개의 요소는 1, 나머지 요소는 0으로 만들어 카테고리형을 표현하는 방법
- 예) df['혈액형_code']를 머신러닝/딥러닝 알고리즘에 넣어 데이터를 예측하려고 지시를 하면 컴퓨터는 값들간의 관계를 스스로 형성하게 됨 -> 만약 B형은 1, AB형은 2라는 값을 가지고 있을 때 컴퓨터는 'B형 + AB형 = O형'라는 이상한 관계를 맺을 수 있게 됨 -> 별도의 column들을 형성해주고 1개의 column에는 1, 나머지는 0으로 넣어줌으로 'A, B, AB, O형의 관계는 서로 독립적이다'라는 카테고리로 표현해주는 방식을 사용
In [ ]:
blood_map = {'A':0, 'B':1, 'AB':2, 'O':3}
In [ ]:
df['혈액형_code'] = df['혈액형'].map(blood_map)
df.head()
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 혈액형_code | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 0 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 0 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 0 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 2 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 0 |
In [ ]:
# pd.get_dummies(): 원 학 인코딩을 적용
pd.get_dummies(df['혈액형_code'])
Out[ ]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 1 | 0 | 0 | 0 |
1 | 1 | 0 | 0 | 0 |
2 | 1 | 0 | 0 | 0 |
3 | 0 | 0 | 1 | 0 |
4 | 1 | 0 | 0 | 0 |
5 | 1 | 0 | 0 | 0 |
6 | 0 | 0 | 0 | 1 |
7 | 0 | 1 | 0 | 0 |
8 | 0 | 0 | 0 | 1 |
9 | 1 | 0 | 0 | 0 |
10 | 1 | 0 | 0 | 0 |
11 | 0 | 1 | 0 | 0 |
12 | 0 | 0 | 1 | 0 |
13 | 0 | 0 | 0 | 1 |
14 | 0 | 0 | 0 | 1 |
In [ ]:
df = pd.get_dummies(df, columns=['혈액형_code'])
In [ ]:
df
Out[ ]:
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 혈액형_code_0 | 혈액형_code_1 | 혈액형_code_2 | 혈액형_code_3 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 1 | 0 | 0 | 0 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 1 | 0 | 0 | 0 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 1 | 0 | 0 | 0 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 0 | 0 | 1 | 0 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 1 | 0 | 0 | 0 |
5 | 정국 | 방탄소년단 | 빅히트 | 남자 | 1997-09-01 | 178.0 | A | 5208335 | 1 | 0 | 0 | 0 |
6 | 민현 | 뉴이스트 | 플레디스 | 남자 | 1995-08-09 | 182.3 | O | 4989792 | 0 | 0 | 0 | 1 |
7 | 소연 | 아이들 | 큐브 | 여자 | 1998-08-26 | NaN | B | 4668615 | 0 | 1 | 0 | 0 |
8 | 진 | 방탄소년단 | 빅히트 | 남자 | 1992-12-04 | 179.2 | O | 4570308 | 0 | 0 | 0 | 1 |
9 | 하성운 | 핫샷 | 스타크루이엔티 | 남자 | 1994-03-22 | 167.1 | A | 4036489 | 1 | 0 | 0 | 0 |
10 | 태연 | 소녀시대 | SM | 여자 | 1989-03-09 | NaN | A | 3918661 | 1 | 0 | 0 | 0 |
11 | 차은우 | 아스트로 | 판타지오 | 남자 | 1997-03-30 | 183.0 | B | 3506027 | 0 | 1 | 0 | 0 |
12 | 백호 | 뉴이스트 | 플레디스 | 남자 | 1995-07-21 | 175.0 | AB | 3301654 | 0 | 0 | 1 | 0 |
13 | JR | 뉴이스트 | 플레디스 | 남자 | 1995-06-08 | 176.0 | O | 3274137 | 0 | 0 | 0 | 1 |
14 | 슈가 | 방탄소년단 | 빅히트 | 남자 | 1993-03-09 | 174.0 | O | 2925442 | 0 | 0 | 0 | 1 |
In [ ]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 이름 15 non-null object
1 그룹 14 non-null object
2 소속사 15 non-null object
3 성별 15 non-null object
4 생년월일 15 non-null object
5 키 13 non-null float64
6 혈액형 15 non-null object
7 브랜드평판지수 15 non-null int64
8 혈액형_code_0 15 non-null uint8
9 혈액형_code_1 15 non-null uint8
10 혈액형_code_2 15 non-null uint8
11 혈액형_code_3 15 non-null uint8
dtypes: float64(1), int64(1), object(6), uint8(4)
memory usage: 1.1+ KB
728x90
반응형
'파이썬 데이터 분석' 카테고리의 다른 글
(Python) 형태소 (0) | 2023.06.08 |
---|---|
(Python) 가상 쇼핑몰 데이터 프로젝트 (0) | 2023.06.08 |
(Python) 데이터프레임 활용 (0) | 2023.06.08 |
(Python) Matplotlib (0) | 2023.06.08 |
(Python) Numpy (0) | 2023.05.18 |
Comments