2T_Pandas Basic (2) - 데이터 합치기( df.merge, join)


In [1]:
users_df = pd.DataFrame(columns=["Name", "Age", "Signup Date"])

In [2]:
# 가입일의 경우에는 2016 - 05 - 01 이런 형태로
users_df.loc[0] = ["김기표", "29", "2016-05-18"]
users_df.loc[1] = ["백인국", "29", "2016-04-03"]
users_df


Out[2]:
Name Age Signup Date
0 김기표 29 2016-05-18
1 백인국 29 2016-04-03

In [3]:
purchase_df = pd.DataFrame(columns=["Amount", "Purchase Date"])
purchase_df


Out[3]:
Amount Purchase Date

In [4]:
# 2개의 정보가 서로 연결되기 위해서 새로운 숫자를 부여해야 한다.
users_df = pd.DataFrame(columns=["id", "Name", "Age", "Signup Date"])
users_df.loc[0] = ["1", "김기표", "29", "2016-05-18"]
users_df.loc[1] = ["2", "백인국", "29", "2016-04-03"]

In [5]:
purchase_df = pd.DataFrame(columns=["User ID", "Amount", "Purchase Date"])
purchase_df.loc[0] = ["1", "4000", "2016-05-18"]
purchase_df.loc[1] = ["1", "8000", "2016-05-25"]
purchase_df.loc[2] = ["2", "12000", "2016-06-18"]
purchase_df.loc[3] = ["2", "15000", "2016-08-18"]
purchase_df.loc[4] = ["2", "18000", "2016-09-18"]
purchase_df


Out[5]:
User ID Amount Purchase Date
0 1 4000 2016-05-18
1 1 8000 2016-05-25
2 2 12000 2016-06-18
3 2 15000 2016-08-18
4 2 18000 2016-09-18

In [6]:
# for 문을 돌리면서, Purchase => 언제 가입한 유저가 언제 구입을 했는지 알기 위해서 df를 합쳐보아라

In [10]:
purchase_df["Signup Date"] = ""

for index, row in purchase_df.iterrows():
    user_id = row["User ID"]
    
    is_user = users_df["id"] == user_id  # Series
    matched_user_df = users_df[is_user].reset_index(drop=True).loc[0] # DataFrame 
    # loc[0] 으로 찾을 수 있게 하기 위해서 reset_index(drop=True) 를 수행한다.
    signup_date = matched_user_df["Signup Date"]
#     print(signup_date)
    
    purchase_df.loc[index]["Signup Date"] = signup_date

In [9]:
purchase_df


Out[9]:
User ID Amount Purchase Date Signup Date
0 1 4000 2016-05-18 2016-05-18
1 1 8000 2016-05-25 2016-05-18
2 2 12000 2016-06-18 2016-04-03
3 2 15000 2016-08-18 2016-04-03
4 2 18000 2016-09-18 2016-04-03

In [11]:
# Pandas 스러운 방법으로 데이터를 합치기 ( merge )
#   + 번외, 더 쉽게 merge 하기 위해서, Column 이름을 변경하는 방법

In [13]:
purchase_df.merge(users_df, left_on="User ID", right_on="id")


Out[13]:
User ID Amount Purchase Date Signup Date_x id Name Age Signup Date_y
0 1 4000 2016-05-18 2016-05-18 1 김기표 29 2016-05-18
1 1 8000 2016-05-25 2016-05-18 1 김기표 29 2016-05-18
2 2 12000 2016-06-18 2016-04-03 2 백인국 29 2016-04-03
3 2 15000 2016-08-18 2016-04-03 2 백인국 29 2016-04-03
4 2 18000 2016-09-18 2016-04-03 2 백인국 29 2016-04-03

In [14]:
# 번외로 기존 Column 이름을 변경하기
users_df


Out[14]:
id Name Age Signup Date
0 1 김기표 29 2016-05-18
1 2 백인국 29 2016-04-03

In [15]:
purchase_df


Out[15]:
User ID Amount Purchase Date Signup Date
0 1 4000 2016-05-18 2016-05-18
1 1 8000 2016-05-25 2016-05-18
2 2 12000 2016-06-18 2016-04-03
3 2 15000 2016-08-18 2016-04-03
4 2 18000 2016-09-18 2016-04-03

In [16]:
users_df.rename(columns={"id": "User ID"}, inplace=True)
users_df


Out[16]:
User ID Name Age Signup Date
0 1 김기표 29 2016-05-18
1 2 백인국 29 2016-04-03

In [17]:
purchase_df.merge(users_df)
# purchase_df.merge(users_df, left_on="User ID", right_on="User ID")


Out[17]:
User ID Amount Purchase Date Signup Date Name Age
0 1 4000 2016-05-18 2016-05-18 김기표 29
1 1 8000 2016-05-25 2016-05-18 김기표 29
2 2 12000 2016-06-18 2016-04-03 백인국 29
3 2 15000 2016-08-18 2016-04-03 백인국 29
4 2 18000 2016-09-18 2016-04-03 백인국 29
  • 항상 데이터가 완결하다는 보장이 없기 때문에,
  • SQL에서는 조인, Pandas에서는 merge를 쓴다. 이 방법이 중요하다.

In [18]:
users_df.merge?
#inner, outer, ... 기본값으로 inner 조인이다.