2024.01.02 TIL

녹차·2024년 1월 2일

TIL_Python

목록 보기
2/9

학습 주제

  • Series의 다양한 기능, Seires 과제

Series 생성 (Create)

numbers = list(range(3, 14))
numbers

[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

  • numbers를 Series로 생성
pd.Series(numbers)
0      3
1      4
2      5
3      6
4      7
5      8
6      9
7     10
8     11
9     12
10    13
dtype: int64
  • 문자열 또한 Series로 생성 가능
letters = list('programmers')

pd.Series(letters)
0     p
1     r
2     o
3     g
4     r
5     a
6     m
7     m
8     e
9     r
10    s
dtype: object
  • Series에 index 부여
letters_index = {f"문자{i}" for i in range(1, 12)}
letters_index

pd.Series(letters, index=letters_index)
문자7     p
문자11    r
문자1     o
문자2     g
문자9     r
문자6     a
문자10    m
문자8     m
문자3     e
문자5     r
문자4     s
dtype: object
  • Dictionary를 Series화
# Dict -> Series
user = {
    "name": "Spencer",
    "age": 20,
    "job": None
}

# key->index, value->value
pd.Series(user)
name    Spencer
age          20
job        None
dtype: object
  • index 설정
# Dict->Series 할 때 index를 지정하면
pd.Series(user, index=['name', 'age', 'address'])
name       Spencer
age             20
address        NaN
dtype: object

Series 속성 (Attribute)

numbers = list(range(1, 7))
letters = list("spencer")
numbers, letters

([1, 2, 3, 4, 5, 6], ['s', 'p', 'e', 'n', 'c', 'e', 'r'])

  • series로 설정
number_series = pd.Series(numbers)
letters_series = pd.Series(letters)
  • .dtype
# dtype : 시리즈가 반환하는(담고있는) 데이터 타입
number_series.dtype

letters_series.dtype # O는 object라는 의미

dtype('int64')

dtype('O')

  • .index
    • .index는 인덱스에 대한 정보를 준다.
number_series.index

letters_series.index

RangeIndex(start=0, stop=6, step=1)

RangeIndex(start=0, stop=7, step=1)

💡 Range형식으로 인덱스에 대한 정보를 준다.
  • .values
# 각각의 데이터의 유형이 다 같아야함
number_series.values

letters_series.values

array([1, 2, 3, 4, 5, 6], dtype=int64)

array(['s', 'p', 'e', 'n', 'c', 'e', 'r'], dtype=object)

  • .shape
    • .shape는 데이터의 구조를 알 수 있으며, Series는 1차원 구조다.
number_series.shape

letters_series.shape

(6,)

(7,)

  • .size
    • .size는 데이터의 크기를 알 수 있다.
number_series.size

letters_series.size

6

7

  • .hasnans
    • .hasnan은 None이나 NaN같은 결측치(Missing Data)가 있는지 확인한다.
number_series.hasnans

letters_series.hasnans

False

False

Series 메소드 (Method)

  • 우선 예제에 사용할 series를 생성합니다.
scores = [90.5, 55.5, 81.4, None, 75.6]

scores_series = pd.Series(scores)
  • .max() - 최대값(Maximum value
scores_series.max()

90.5

  • .idxmax() - 최대값의 인덱스
scores_series.idxmax()

0

  • .min() - 최소값(Minimum Value)
scores_series.min()

55.5

  • .idxmin() - 최소값의 인덱스
scores_series.idxmin()

1

  • .sum() - 합계
scores_series.sum()

303.0

  • .mean() - 평균
scores_series.mean()

75.75

  • .isnull(), isna() - 결측치 체크 - 값(value)중 null 또는 not 유형의 데이터가 없는가?
scores_series.isnull()

scores_series.isna()
0    False
1    False
2    False
3     True
4    False
dtype: bool
  • .round() - 각 수치 반올림
scores_series.round()
0    90.0
1    56.0
2    81.0
3     NaN
4    76.0
dtype: float64

반올림 사사오입과 오사오입

round(4.5)

round(5.5)

4

6

❓ 왜 4를 반올림했는데 4가나올까?
  • 학교에서 배운 반올림 - 사사오입 - Round off

초등학교, 중학교 수학에서 반올림은 이 경우 '올림'으로 처리합니다.

0, 1, 2, 3, 4 는 내림(버리고)

5, 6, 7, 8, 9 는 올리고

다만 이 때 통계적으로 '중립성'이 깨지게 됩니다. 예를 들어볼까요?

0.5 + 1.5 + 2.5 + 3.5 = 8.5 입니다. 그런데 각 항목에 위치하는 값을 반올림을 하여 합산을 하면

1 + 2 + 3 + 4= 10이 됩니다. 전체 값이 1.5 증가하는 현상이 발생합니다.

세상에는 소수점 데이터가 많습니다.

그리고 위 예시는 4개의 값만 다뤘으나 이는 통계학이나 빅데이터와 같은 많은 값을 다루는 분야에서라면 오차가 크게 발생할 수 있습니다.

즉,"반절 위치를 '올림'으로 처리하는 것은 중립적이지 못하다!"

라고 보며, 통계학에선 오사오입 반올림을 사용합니다.

  • 오사오입 - Round half to even - Python의 반올림 원리

반올림할 숫자가 정확히 반절 위치일 경우,

가까운 짝수 쪽으로 반올림하는 규칙입니다.

다르게 말하면 '반올림할 숫자가 절반일 경우에 그 결과는 무조건 짝수'가 됩니다. (0, 2, 4, 6, 8)

1에서와 동일한 예시를 볼까요?

0.5 + 1.5 + 2.5 + 3.5 = 8.5 인데, 오사오입 방식으로 이용하여 가까운 짝수 쪽으로 반올림을 하면

0 + 2 + 2 + 4 = 8로, 오차는 0.5가 됩니다.

좀 더 간단한 예시로 들면

0.5 + 1.5 = 2.0을

기존 방식을 반올림으로 하면 1 + 2 = 3이 되는데

오사오입으로 반올림 하면 0 + 2 = 2로 오차가 없어집니다.

즉, '반절 위치가 나올 경우, 해당 경우의 반절은 올림 또 다른 반절은 내림으로 처리하여 중립성을 만든다' 로 보면 됩니다. (균형을 맞춰라!)

파이썬은 통계학, 데이터 분석, 머신러닝 등에 자주 사용되는 프로그래밍 언어이죠?

오사오입은 자연과학, 공학, 통계에서 주로 사용하는 방식이며,

파이썬 또한 반올림 방식도 오사오입을 따르고 있습니다.

CSV, DataFrame 데이터 로드와 세이브

# csv 전체 가져오기 -> DataFrame
richest_dataset = pd.read_csv('TopRichestInWorld.csv')
richest_dataset
  • csv 파일은 DataFrame 형식으로 가져와 집니다.
type(richest_dataset)

pandas.core.frame.DataFrame

  • csv에서 특정 열만 가져오기
# csv에서 특정 열만 가져오기 -> DataFrame
richest_dataset['Age']
0      50
1      58
2      73
3      66
4      91
       ..
96     61
97     76
98     63
99     66
100    75
Name: Age, Length: 101, dtype: int64
  • csv에서 특정 열만 series로 가져오기
# csv에서 특정 열만 Series로 가져오기 -> .squeeze() -> Series
# csv에서 특정 열만 가져오기 -> DataFrame
richest_series = pd.read_csv('TopRichestInWorld.csv', usecols=['Name']).squeeze()
richest_series
0                     Elon Musk
1                    Jeff Bezos
2      Bernard Arnault & family
3                    Bill Gates
4                Warren Buffett
                 ...
96             Vladimir Potanin
97         Harold Hamm & family
98                 Sun Piaoyang
99           Luo Liguo & family
100                   Peter Woo
Name: Name, Length: 101, dtype: object
  • csv파일로 내보내기
richest_series.to_csv('TopRichestInWorld_new.csv')

Series 조회 (head, tail)

  • .head()는 앞측 데이터를 원하는 만큼 볼 수 있다.
rich_set.head()
  • .tail()은 뒷측 데이터를 원하는 만큼 볼 수 있다.
rich_set.tail()

Series 값 정의 (sort_values, axis, ascending, kind, na_positions, ignore_index)

  • .sort_values()
    • 이름이 A-Z순으로 오름차순 되어있는 걸 확인할 수 있다.
rich_df.sort_values()
74         Abigail Johnson
42        Alain Wertheimer
17            Alice Walton
22          Amancio Ortega
89          Andrew Forrest
              ...         
4           Warren Buffett
54        William Lei Ding
85    Yang Huiyan & family
24            Zhang Yiming
16          Zhong Shanshan
Name: Name, Length: 101, dtype: object
  • axis=, ascending=
    • axis(축)
      • 정렬에 사용할 축을 지정
      • default가 0
      • Series는 1차원 데이터라 축이 1개라서 의미가 없음
      • DataFrame은 2차원데이터라 축이 2개
    • ascending
      • 오름차순(True)
      • 내림차순(False)
      • default는 오름차순
rich_df.sort_values(axis=0, ascending=False)
16          Zhong Shanshan
24            Zhang Yiming
85    Yang Huiyan & family
54        William Lei Ding
4           Warren Buffett
              ...
89          Andrew Forrest
22          Amancio Ortega
17            Alice Walton
42        Alain Wertheimer
74         Abigail Johnson
Name: Name, Length: 101, dtype: object
  • kind=, na_position=
    • kind
      • 정렬에 사용할 정렬 알고리즘 지정
      • 특이한 상황이 아닌 경우 quicksort가 우수한 성능
      • 그래서 default는 quicksort
    • na_position
      • NaN값을 어디로 배치할지 정하는 함수
      • default는 last
rich_df.sort_values(axis=0, ascending=False, kind='quicksort', na_position='last')
  • ignore_index=
    • 정렬할 때 index열도 같이 정렬할 건지(False)
    • 유지하고 정렬할 건지(True)를 지정
    • default는 False
rich_df.sort_values(axis=0, ascending=False, kind='quicksort', na_position='last', ignore_index=True)
0            Zhong Shanshan
1              Zhang Yiming
2      Yang Huiyan & family
3          William Lei Ding
4            Warren Buffett
               ...
96           Andrew Forrest
97           Amancio Ortega
98             Alice Walton
99         Alain Wertheimer
100         Abigail Johnson
Name: Name, Length: 101, dtype: object

Series 값 정렬 (inplace)

  • 비파괴적 처리
    • 원본 데이터가 파괴되지 않는다.
    • 저장할 땐  변수 = 원본.메소드()와 같은 문법 사용
#비파과적 처리

numbers = [1, 9, 3, 6, 7]
sorted(numbers)
  • 그렇기 때문에 비파괴적인 처리 결과를 저장하려면 다음과 같이 해야함
numbers = [1, 9, 3, 6, 7]
numbers = sorted(numbers)
numbers
# 지금까지 실습한 sort_values()결과를 저장하려면
rich_set = rich_df.sort_values(axis=0, ascending=True,
                    kind='quicksort', na_position='last',
                    ignore_index=True)
rich_set
  • 파괴적 처리
    • 원본 데이터가 파괴된다.
    • 원본이 파괴되기 때문에 굳이 변수 = 원본.메소드()와 같은 문법을 사용하지 않는다.
    • 원본.메소드() 반환 값은 없거나, 있다면 주로 함수 실행 성공 여부(True/False) 또는 결과를 대략 파악할 수 있는 값이 반환된다.
numbers = [1, 9, 3, 6, 7]
numbers.sort()
# 카피본 만들고 사용하기
rich_df_copy = rich_df.copy()
rich_df_copy.sort_values(inplace=True)

Series 값 정렬 (key=)

  • 정렬에 필요한 크고 작음의 기준을 정함

  • 글자라면 A-Z순, 숫자라면 크고 작음

  • 예시1

basket = ['apple', 'Banana', 'Cherry', 'durian']
basket_series = pd.Series(basket)

# 그냥 sort_values()를 하면 문자부호 순서로 소문자가 무조건 밀려난다. (아스키코드 + 유니코드)
basket_series.sort_values()
1    Banana
2    Cherry
0     apple
3    durian
dtype: object
# 만일 모두 대문자 또는 소문자라고 치고 정렬하려면?
basket_series.sort_values(key = lambda x: x.str.lower())
0     apple
1    Banana
2    Cherry
3    durian
dtype: object
💡 .str.lower() 는 현재 시리즈의 값을 모두 문자열로 만든 다음 소문자로 변환하는 코드이다.

파이썬에서도 str()같은 함수를 지원하지만, pandas는 데이터를 변환하는 과정이 많다보니

map()함수처럼 데이터 각각 처리하고 +.함수.함수 처럼 체인 형태의 코딩이 쉽도록 개선해놓는다.

# .str.lower()까지 하면?
basket_series.str.lower()
0     apple
1    banana
2    cherry
3    durian
dtype: object
  • 예제2
    • 현재 rich_df를 정렬하면 이름의 A-Z순으로 나온다.
rich_df.sort_values()
74         Abigail Johnson
42        Alain Wertheimer
17            Alice Walton
22          Amancio Ortega
89          Andrew Forrest
              ...
4           Warren Buffett
54        William Lei Ding
85    Yang Huiyan & family
24            Zhang Yiming
16          Zhong Shanshan
Name: Name, Length: 101, dtype: object
  • 이름 글자수가 적은 사람부터 오름차순 배치
rich_df.sort_values(key=lambda x : x.str.len())
67                                       Jack Ma
61                                      Li Shufu
57                                      Wang Wei
0                                      Elon Musk
93                                     Li Xiting
                         ...
84                   Theo Albrecht, Jr. & family
51                 Leonardo Del Vecchio & family
44           German Larrea Mota Velasco & family
13         Francoise Bettencourt Meyers & family
34    Beate Heister & Karl Albrecht Jr. & family
Name: Name, Length: 101, dtype: object
❓ [의문] lambda 인자에 들어오는 x값이 문자열이면 바로 len(x), lower(x)로 해도 되지 않나? 💡 '각 데이터는 문자열(string)로 가져온 것'이 아닌 'Series'로 가져와집니다.
key=lambda x: x.str.len()

에서 x에 담기는 데이터 유형은 Series이니 에러가 발생합니다.

Series 인덱스 정렬 (sort_index)

  • DataFrame의 인덱스는 별개의 데이터이다.
    • 1번이 삭제된다고 해서 2번이 1번으로 당겨지지 않음, 색인 객체임
rich_set.sort_index()
0                     Elon Musk
1                    Jeff Bezos
2      Bernard Arnault & family
3                    Bill Gates
4                Warren Buffett
                 ...
96             Vladimir Potanin
97         Harold Hamm & family
98                 Sun Piaoyang
99           Luo Liguo & family
100                   Peter Woo
Name: Name, Length: 101, dtype: object
rich_set.sort_index(ascending = False)
100                   Peter Woo
99           Luo Liguo & family
98                 Sun Piaoyang
97         Harold Hamm & family
96             Vladimir Potanin
                 ...
4                Warren Buffett
3                    Bill Gates
2      Bernard Arnault & family
1                    Jeff Bezos
0                     Elon Musk
Name: Name, Length: 101, dtype: object

Series 값 세기 (value_counts)

  • .value_counts()

  • 우선 나라 열만 가져오겠습니다.

# 나라 열만 가져오기 -> 시리즈 화
rich_country = pd.read_csv('TopRichestInWorld.csv', usecols=["Country/Territory"]).squeeze()
rich_country
0      United States
1      United States
2             France
3      United States
4      United States
           ...
96            Russia
97     United States
98             China
99             China
100        Hong Kong
Name: Country/Territory, Length: 101, dtype: object
  • 각 나라별 count를 할 수 있도록 .value_counts()를 사용합니다.
# value_counts : collection.Counter와 비슷한 기능
rich_country.value_counts()
Country/Territory
United States    37
China            18
India             7
Germany           7
France            7
Hong Kong         4
Japan             3
Australia         2
Russia            2
Indonesia         2
Italy             2
Canada            2
Mexico            2
Austria           1
Spain             1
Switzerland       1
Chile             1
Singapore         1
Sweden            1
Name: count, dtype: int64
  • normalize= - 정규화
    • 퍼센트처럼 비중으로 계산하는 작업 수행
rich_country.value_counts(normalize=False) # 실제 수
rich_country.value_counts(normalize=True) # 백분율
Country/Territory
United States    0.366337
China            0.178218
India            0.069307
Germany          0.069307
France           0.069307
Hong Kong        0.039604
Japan            0.029703
Australia        0.019802
Russia           0.019802
Indonesia        0.019802
Italy            0.019802
Canada           0.019802
Mexico           0.019802
Austria          0.009901
Spain            0.009901
Switzerland      0.009901
Chile            0.009901
Singapore        0.009901
Sweden           0.009901
Name: proportion, dtype: float64
  • sort=, ascending=
    • sort
      • 빈도별로 정렬
      • False면 정렬이 안됨
    • ascending
      • True면 오름차순
      • Flase면 내림차순
# 부자로 가장 유니크한 산업을 찾는다면
rich_industry.value_counts(normalize=True, sort=True)
Industry
Fashion & Retail         0.178218
Technology               0.148515
Finance & Investments    0.128713
Metals & Mining          0.089109
Food & Beverage          0.079208
Automotive               0.069307
Diversified              0.059406
Manufacturing            0.049505
Healthcare               0.049505
Media & Entertainment    0.039604
Real Estate              0.029703
Telecom                  0.019802
Logistics                0.019802
Energy                   0.019802
Gambling & Casinos       0.009901
Service                  0.009901
Name: proportion, dtype: float64
# 부자로 가장 유니크한 산업을 찾는다면
rich_industry.value_counts(normalize=True, ascending=True)
Industry
Gambling & Casinos       0.009901
Service                  0.009901
Telecom                  0.019802
Logistics                0.019802
Energy                   0.019802
Real Estate              0.029703
Media & Entertainment    0.039604
Manufacturing            0.049505
Healthcare               0.049505
Diversified              0.059406
Automotive               0.069307
Food & Beverage          0.079208
Metals & Mining          0.089109
Finance & Investments    0.128713
Technology               0.148515
Fashion & Retail         0.178218
Name: proportion, dtype: float64
  • bins=
    • 개수를 입력하여, 그 만큼 구간을 나누어 count
    • 숫자처럼 연속형 데이터만 가능
# 나이 열만 가져오기 -> 시리즈 화
rich_age=pd.read_csv('TopRichestInWorld.csv', usecols=['Age']).squeeze()
rich_age

#bin 사용
rich_age.value_counts(bins=5)
Age
(55.6, 68.4]      33
(68.4, 81.2]      27
(81.2, 94.0]      19
(42.8, 55.6]      17
(29.935, 42.8]     5
Name: count, dtype: int64

# bins를 5로 설정하여 5구간으로 나누어 출력
  • dropna= - NaN처리
    • count 시에 NaN형 데이터를 처리할지를 결정
    • default True라서 None이 count 되지 않다가
    • False일 때 None도 count
data_set.value_counts(normalize=True)
banana    0.5
apple     0.5
Name: proportion, dtype: float64
  • 평소에는 none이 배제되어 출력
data_set.value_counts(dropna=False) #결측치 사용할때 유용
banana    2
apple     2
None      1
NaN       1
Name: count, dtype: int64
  • dropna 사용시 none값도 같이 출력

Series 인덱스 위치 기반 조회

  • 특정 인덱스 조회
rich_name[0]

rich_name[100]

# 범위를 넘기면 에러
rich_name[[0, 5, 15]]
0      Elon Musk
5     Larry Page
15    Jim Walton
Name: Name, dtype: object
  • 인덱스 슬라이싱을 이용한 조회
# head와 동일한 기능
rich_name[0:5]
0                   Elon Musk
1                  Jeff Bezos
2    Bernard Arnault & family
3                  Bill Gates
4              Warren Buffett
Name: Name, dtype: object
# 슬라이스 숫자 생략도 파이썬처럼 가능
rich_name[5:]

# 0~50명단까지, 5배수에 해당하는 사람 이름을 조회하려면
rich_name[4:50:5]
  • Series 인덱스 조회
data = ['banana', 'apple', 'coconut']
data_se = pd.Series(data)
data_se.index

RangeIndex(start=0, stop=3, step=1)

user = {"name": "Spencer", "age": 20, "job": None}
user_se = pd.Series(user)
user_se.index

Index(['name', 'age', 'job'], dtype='object')

🔥 **RangeIndex**
  • RangeIndex는 순차적인 정수로 구성된 인덱스 객체.
  • 데이터프레임(DataFrame)이나 시리즈(Series)를 생성할 때, 명시적으로 인덱스를 지정하지 않은 경우에 기본적으로 생성되는 인덱스.
  • RangeIndex는 0부터 시작하는 정수로 구성되며
  • 일반적으로 데이터의 길이 또는 행의 개수에 따라 자동으로 생성
  • RangeIndex는 변경할 수 없는(immutable) 객체로, 크기가 고정.
  • RangeIndex는 메모리 사용을 최적화하여 데이터의 검색과 접근 속도를 향상시킵니다.

Index

  • Index는 일련의 값으로 구성된 인덱스 객체.
  • 문자열, 정수, 날짜 등 다양한 데이터 타입을 가질 수 있다.
  • Index는 RangeIndex와 달리 명시적으로 지정되거나 다른 데이터의 인덱스로부터 생성될 수 있다.
  • Index는 변경 가능한(mutable) 객체
  • 따라서, 인덱스의 값이나 순서를 변경하거나 인덱스를 추가/삭제할 수 있다.
  • Index는 데이터의 레이블링, 인덱싱, 슬라이싱 등 다양한 데이터 조작 작업에 활용된다.

RangeIndex vs Index 요약

  • RangeIndex
    • 순차적인 정수로 구성되는 고정 크기의 인덱스 객체,
  • Index
    • 일련의 값으로 구성되며 변경 가능한 특성을 가진 인덱스 객체
  • 두 객체 모두 데이터프레임이나 시리즈의 인덱스로 사용되고, 데이터 조작 및 접근을 위해 다양한 기능을 제공.
🔥 **`del user_set['name']`는 되고 `del user_set[0]`은 안되는 이유**
  • del user_set['name'] : 인덱스 레이블을 사용하여 해당하는 인덱스와 값을 삭제하는 것
  • del user_set[0] : 정수 인덱스를 사용하여 삭제하는 것이 불가능

정수 인덱스? 인덱스 레이블?

  • 인덱스가 문자열일 경우 Series객체는 인덱스를 사용할 수 있다는 원칙이 있다.
  • Series 객체는 인덱스 레이블 기준 연산이 우선된다.

삭제 연산은 레이블 접근만 허용

  • 조회는 데이터를 파괴하지 않기에 정수 인덱스를 통한 방식도 허용하나
  • del을 이용한 삭제는 인덱스 레이블 방식만 허용한다.

과제

  • Pandas를 참조합시다. (별칭 부여해서)
**import** pandas **as** pd
  • 데이터를 읽어옵니다. 1
    • TopRichestInWorld.csv
rich_df **=** pd.read_csv('TopRichestInWorld.csv')
rich_df
NameNetWorthAgeCountry/TerritorySourceIndustry
0Elon Musk$219,000,000,00050United StatesTesla, SpaceXAutomotive
1Jeff Bezos$171,000,000,00058United StatesAmazonTechnology
2Bernard Arnault & family$158,000,000,00073FranceLVMHFashion & Retail
3Bill Gates$129,000,000,00066United StatesMicrosoftTechnology
4Warren Buffett$118,000,000,00091United StatesBerkshire HathawayFinance & Investments
.....................
96Vladimir Potanin$17,300,000,00061RussiametalsMetals & Mining
97Harold Hamm & family$17,200,000,00076United Statesoil & gasEnergy
98Sun Piaoyang$17,100,000,00063ChinapharmaceuticalsHealthcare
99Luo Liguo & family$17,000,000,00066ChinachemicalsManufacturing
100Peter Woo$17,000,000,00075Hong Kongreal estateReal Estate

101 rows × 6 columns

  • 데이터를 읽어옵니다.2
    • TopRichestInWorld.csv
    • Industry 열만 사용하고
    • 시리즈화 시키자.
rich_df **=** pd.read_csv('TopRichestInWorld.csv', usecols**=**['Industry']).squeeze()
rich_df
0                 Automotive
1                 Technology
2           Fashion & Retail
3                 Technology
4      Finance & Investments
               ...
96           Metals & Mining
97                    Energy
98                Healthcare
99             Manufacturing
100              Real Estate
Name: Industry, Length: 101, dtype: object
  • 데이터를 읽어옵시다. 3
    • TopRichestInWorld.csv
    • col은 Age열 정보를 사용하고
    • index는 Name열 정보를 사용하고
    • 데이터를 시리즈화 시키자.
rich_df **=** pd.read_csv('TopRichestInWorld.csv', 
usecols**=**['Age', 'Name'], index_col **=** 'Name').squeeze()
rich_df
Name
Elon Musk                   50
Jeff Bezos                  58
Bernard Arnault & family    73
Bill Gates                  66
Warren Buffett              91
                            ..
Vladimir Potanin            61
Harold Hamm & family        76
Sun Piaoyang                63
Luo Liguo & family          66
Peter Woo                   75
Name: Age, Length: 101, dtype: int64
  • 평균 나이가 어떻게 되나요? 1
rich_df.mean()

67.11881188118812

  • 평균 나이가 어떻게 되나요? 2
    • 소수점 1자리까지 반올림 합니다.
round(rich_df.mean(), 1)

67.1

  • 누가 가장 어리나요?
    • 코드로 그 사람 이름이 나오도록 해봅시다.
    • 정렬을 사용하지 말고, 바로 지원하는 메소드를 생각해봅시다.
    • 힌트 : 현재 index에는 이름이 저장되어있습니다. 때문에 나이가 어린 사람의 인덱스를 찾는다면 이름이 나오는 거겠죠?
rich_df.idxmin()

'Sam Bankman-Fried'

  • 누가 가장 나이가 많나요?
    • 코드로 그 사람 이름이 나오도록 해봅시다.
rich_df.idxmax()

'Lee Shau Kee'

  • 어린 순으로 정렬해봅시다.
rich_df.sort_values()
Name
Sam Bankman-Fried          30
Mark Zuckerberg            37
Zhang Yiming               38
Yang Huiyan & family       40
Guillaume Pousaz           40
                           ..
Leonard Lauder             89
Rupert Murdoch & family    91
Warren Buffett             91
Li Ka-shing                93
Lee Shau Kee               94
Name: Age, Length: 101, dtype: int64
  • 나이 분포가 어떻게 되나요? 1
    • 5개로 구분하며
    • 몇 명인지를 파악합시다.
    • 비중이 높은 순으로 내림차순 합니다.
rich_df.value_counts(bins **=** 5)
Age
(55.6, 68.4]      33
(68.4, 81.2]      27
(81.2, 94.0]      19
(42.8, 55.6]      17
(29.935, 42.8]     5
Name: count, dtype: int64
  • 나이 분포가 어떻게 되나요? 2
    • 5개로 구분하며
    • 퍼센트 비중으로 어떠한지 파악합시다.
    • 비중이 높은 순으로 내림차순 합니다.
rich_df.value_counts(normalize**=True**, bins **=** 5)
Age
(55.6, 68.4]      0.326733
(68.4, 81.2]      0.267327
(81.2, 94.0]      0.188119
(42.8, 55.6]      0.168317
(29.935, 42.8]    0.049505
Name: proportion, dtype: float64
  • 나이가 어린 순으로 새로운 csv를 저장합시다.
    • 파일 이름은 TopYoungestAndRichiInWorld.csv
rich_df.sort_values().to_csv('TopYoungestAndRichiInWorld.csv')
  • 제대로 저장되었는지 데이터 확인해봅시다.
new_rich **=** pd.read_csv('TopYoungestAndRichiInWorld.csv')

new_rich
NameAge
0Sam Bankman-Fried30
1Mark Zuckerberg37
2Zhang Yiming38
3Yang Huiyan & family40
4Guillaume Pousaz40
.........
96Leonard Lauder89
97Rupert Murdoch & family91
98Warren Buffett91
99Li Ka-shing93
100Lee Shau Kee94

101 rows × 2 columns

profile
가장 예쁜 꽃은 우여곡절 끝에 피는 꽃

0개의 댓글