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
| makedata.get_age(), makedata.get_name()
|
(21, 'Billy')
[{'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
| 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
| 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"])
for _ in range(15): money_df.loc[len(money_df)] = { "ID": np.random.randint(1, 9), "Money": np.random.randint(1, 21) * 1000, }
ids = money_df["ID"].unique() ids.sort() len(ids), ids
|
(6, array([1, 2, 3, 5, 6, 7], dtype=object))
|
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 |
|
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)
|
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
| 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
| 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 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 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 |
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