summary

  • pandas
    • 데이터 분석 : 데이터 전처리 파트
    • 테이블 형태의 데이터를 처리할때 사용하는 python 라이브러리
    • Series, DataFrame
    • Series
      • 생성, 선택, 수정 방법
    • DataFrame
      • 생성 방법 1 : 딕셔너리의 리스트 : 리스트 -> 컬럼 데이터
      • 생성 방법 2 : 리스트의 딕셔너리 : 딕셔너리 -> 로우 데이터
      • row 선택 : df.loc[idx]
      • column 선택 : df[column name]
      • row, column 선택 : df.loc[idx, column]
      • 함수
        • apply, append, concat
        • groupby, merge
1
import makedata
1
makedata.get_age(), makedata.get_name()
(21, 'Billy')
1
makedata.make_data()
[{'Age': 32, 'Name': 'Alvin'},
 {'Age': 26, 'Name': 'Alan'},
 {'Age': 25, 'Name': 'Anthony'},
 {'Age': 40, 'Name': 'Anthony'},
 {'Age': 35, 'Name': 'Billy'},
 {'Age': 39, 'Name': 'Anthony'},
 {'Age': 30, 'Name': 'Andrew'},
 {'Age': 24, 'Name': 'Andrew'},
 {'Age': 31, 'Name': 'Anthony'},
 {'Age': 40, 'Name': 'Andrew'}]

quiz

  • makedata 모듈을 이용해서 데이터 프레임 만들기
  • user_df
    • 8명의 데이터가 있는 데이터 프레임을 만드세요.
    • UserID : 1 ~ 8
    • Name : makedata.get_name()
    • Age : makedata.get_age()
    • 중복되는 Name 값이 없도록
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 딕셔너리의 리스트 : UserID, Name, Age
datas = {}
datas["UserID"] = list(range(1, 9))
datas["Age"] = [makedata.get_age() for _ in range(8)]
names = []
while True:
name = makedata.get_name()
if name not in names:
names.append(name)
if len(names) >= 8:
break
datas["Name"] = names

user_df = pd.DataFrame(datas)
user_df

UserID Age Name
0 1 22 Anchal
1 2 35 Andrew
2 3 29 Anthony
3 4 21 Billy
4 5 35 Arnold
5 6 32 Alan
6 7 34 Alvin
7 8 22 Adam
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 딕셔너리 데이터를 데이터 프레임에 하나씩 추가하기 : UserID, Name, Age
user_df = pd.DataFrame(columns=["UserID", "Name", "Age"])

for idx in range(1, 9):

name = makedata.get_name()
while name in list(user_df["Name"]):
name = makedata.get_name()

data = {"Name": name, "UserID": idx, "Age": makedata.get_age()}

user_df.loc[len(user_df)] = data

user_df

UserID Name Age
0 1 Billy 23
1 2 Adam 26
2 3 Anchal 23
3 4 Alan 39
4 5 Alvin 20
5 6 Andrew 32
6 7 Arnold 22
7 8 Alex 30

quiz

  • money_df 만들기
    • 15개의 데이터
    • ID : 1 ~ 8 랜덤한 숫자 데이터
    • Money : 1000원 단위로 1000원 ~ 20000원까지의 숫자가 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
# 딕셔너리 데이터를 데이터 프레임에 하나씩 추가하기
money_df = pd.DataFrame(columns=["ID", "Money"])
# np.random.randint(1, 9)
for _ in range(15):
money_df.loc[len(money_df)] = {
"ID": np.random.randint(1, 9),
"Money": np.random.randint(1, 21) * 1000,
}

# 컬럼데이터에서 Unique 값 확인
ids = money_df["ID"].unique()
ids.sort()
len(ids), ids
(6, array([1, 2, 3, 5, 6, 7], dtype=object))
1
money_df

ID Money
0 5 20000
1 6 5000
2 2 9000
3 7 4000
4 3 13000
5 2 14000
6 1 3000
7 1 16000
8 2 6000
9 6 13000
10 7 9000
11 1 16000
12 1 10000
13 2 15000
14 7 14000
1
user_df

UserID Name Age
0 1 Billy 23
1 2 Adam 26
2 3 Anchal 23
3 4 Alan 39
4 5 Alvin 20
5 6 Andrew 32
6 7 Arnold 22
7 8 Alex 30

1. merge

1
user_df.merge(money_df, left_on="UserID", right_on="ID")

UserID Name Age ID Money
0 1 Billy 23 1 3000
1 1 Billy 23 1 16000
2 1 Billy 23 1 16000
3 1 Billy 23 1 10000
4 2 Adam 26 2 9000
5 2 Adam 26 2 14000
6 2 Adam 26 2 6000
7 2 Adam 26 2 15000
8 3 Anchal 23 3 13000
9 5 Alvin 20 5 20000
10 6 Andrew 32 6 5000
11 6 Andrew 32 6 13000
12 7 Arnold 22 7 4000
13 7 Arnold 22 7 9000
14 7 Arnold 22 7 14000
1
2
3
# 컬럼명 변경
user_df.rename(columns={"UserID":"ID"}, inplace=True)
user_df.tail(1)

ID Name Age
7 8 Alex 30
1
user_df.merge(money_df).tail(2)

ID Name Age Money
13 7 Arnold 22 9000
14 7 Arnold 22 14000
1
2
result_df = pd.merge(money_df, user_df)
result_df.tail()

ID Money Name Age
10 3 13000 Anchal 23
11 1 3000 Billy 23
12 1 16000 Billy 23
13 1 16000 Billy 23
14 1 10000 Billy 23
1
2
3
# groupby : sum, size, min .. 함수 : Series
money_list = result_df.groupby("Name").sum()["Money"].reset_index()
money_list

Name Money
0 Adam 44000
1 Alvin 20000
2 Anchal 13000
3 Andrew 18000
4 Arnold 27000
5 Billy 45000
1
2
3
# groupby : agg("sum"), agg("mean") .. : DataFrame
money_list = result_df.groupby("Name").agg("sum").reset_index()[["Name", "Money"]]
money_list

Name Money
0 Adam 44000
1 Alvin 20000
2 Anchal 13000
3 Andrew 18000
4 Arnold 27000
5 Billy 45000
1
# merge : money_list, user_df : outer
1
2
result = pd.merge(user_df, money_list, how="outer")
result

ID Name Age Money
0 1 Billy 23 45000.0
1 2 Adam 26 44000.0
2 3 Anchal 23 13000.0
3 4 Alan 39 NaN
4 5 Alvin 20 20000.0
5 6 Andrew 32 18000.0
6 7 Arnold 22 27000.0
7 8 Alex 30 NaN
1
# fillna : NaN 을 특정 데이터로 채워줌
1
2
result.fillna(value=0, inplace=True)
result

ID Name Age Money
0 1 Billy 23 45000.0
1 2 Adam 26 44000.0
2 3 Anchal 23 13000.0
3 4 Alan 39 0.0
4 5 Alvin 20 20000.0
5 6 Andrew 32 18000.0
6 7 Arnold 22 27000.0
7 8 Alex 30 0.0
1
2
# money 컬럼을 정수로 데이터 타입을 변경
result.dtypes
ID         int64
Name      object
Age        int64
Money    float64
dtype: object
1
2
result["Money"] = result["Money"].astype("int")
result

ID Name Age Money
0 1 Billy 23 45000
1 2 Adam 26 44000
2 3 Anchal 23 13000
3 4 Alan 39 0
4 5 Alvin 20 20000
5 6 Andrew 32 18000
6 7 Arnold 22 27000
7 8 Alex 30 0
1
result.sort_values("Money", ascending=False)

ID Name Age Money
0 1 Billy 23 45000
1 2 Adam 26 44000
6 7 Arnold 22 27000
4 5 Alvin 20 20000
5 6 Andrew 32 18000
2 3 Anchal 23 13000
3 4 Alan 39 0
7 8 Alex 30 0
1
np.average(result.sort_values("Money", ascending=False)[:3]["Age"])
23.666666666666668
Author

KangWon Seo

Posted on

2021-03-05

Updated on

2021-03-05

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.