Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Archives
Today
Total
관리 메뉴

Seongho Jang

Ch.8 데이터 전처리(2): 데이터 병합 본문

Data Science Lv.2

Ch.8 데이터 전처리(2): 데이터 병합

seonghojang 2023. 1. 8. 16:35

3. 데이터 병합

bike_sub = bike.sample(n=4, random_state = 123)
bike_sub = bike_sub.reset_index(drop = True)
bike_sub = bike_sub.set_index("datetime")

reset_index(drop = True)로 기존 index를 지우고,

set_index(df["datetime"])으로 datetime을 index로 설정하기

 

bike_1 = df.iloc[:3, :4]
bike_2 = df.iloc[5:8, :4]

pd.concat([bike_1, bike_2])

concat: 데이터를 row 또는 column 방향으로 이어붙이는 함수

데이터 병합 시에 서로 다른 변수 속성 또는 인덱스에 주의

index가 다른데 그대로 이어붙이는 경우 이렇게 되므로, 

이렇게 reset_index를 해주기

 

df_A = pd.read_csv('join_data_group_members.csv') 
df_B = pd.read_csv('join_data_member_room.csv') 

pd.merge(left = df_A, right = df_B, 
         left_on = "member", right_on = "name",
        how = "inner")

merge: 문법이 상당히 직관적이다

 

 

문제2

여름과 겨울의 시간대별 registered 평균을 비교할 때 가장 차이가 많이 나는 시각은?

df = pd.read_csv('bike.csv') 
df["datetime"] = pd.to_datetime(df["datetime"])
df["hour"] = df["datetime"].dt.hour

df_s2 = df.loc[df["season"] == 2, ]
df_s4 = df.loc[df["season"] == 4, ]
df_s2["registered2"] = df_s2["registered"]
df_s4["registered4"] = df_s4["registered"]

df_s2_reg = df_s2.groupby("hour")["registered2"].mean().reset_index(drop = True)
df_s4_reg = df_s4.groupby("hour")["registered4"].mean().reset_index(drop = True)

df_s2s4_reg = pd.concat([df_s2_reg, df_s4_reg], axis = 1)
df_s2s4_reg["diff"] = (df_s2s4_reg["registered2"] - df_s2s4_reg["registered4"]).abs()
df_s2s4_reg_max = df_s2s4_reg.loc[df_s2s4_reg["diff"] == df_s2s4_reg["diff"].max(), ]
df_s2s4_reg_max

길다...

이것저것 조건이 많이 있을 때는, 필요한 부분만 발췌해서 다른 객체에 저장하고 연산하기

조건들만 헷갈리지 않는다면 패턴은 비슷해서 어렵지 않을 것 같다!

 

season == 2, season == 4 인 데이터의 registered라는 컬럼명이 같아서 바꿔줘야 했는데,

concat을 하고 나서

df_s2s4_reg.columns = ["hour", "reg2", "reg4"]

와 같은 방법도 가능하니까 알아두기

 

문제3

비가 온 날에 30도가 넘는 시각의 count 평균은 얼마인가?

df = pd.read_csv('C:/Users/USER/Desktop/SH_Python/bike.csv') 

bike["datetime"] = pd.to_datetime(df["datetime"])
bike["date"] = bike["datetime"].dt.date 

bike_h100 = bike.groupby("date")["humidity"].max().reset_index()
            # 각 일자별 humidity의 최대값 구하기

bike_h100 = bike_h100.loc[bike_h100["humidity"] == 100, ]
            # 최대 humidity가 100인 날만 뽑아내기

bike_join = pd.merge(left = bike, right = bike_h100,
                    left_on = "date", right_on = "date", how = "inner")
            # inner join으로 max humidity가 100인 날만의 데이터만 join
            
bike_join_up30 = bike_join.loc[bike_join["temp"] > 30, ]
bike_join_up30["count"].mean()

간단한 문제에 비해서 생각보다 이것저것 손이 많이 간다...

데이터가 일자별/시간별 데이터가 있기 때문에,

groupby로 일자별 습도의 최대값을 구하고, 최대 습도가 100인 값만 발췌,

원본 데이터에 merge 한 다음 온도가 30도 넘는 데이터만 다시 발췌

생각보다 너무 복잡한 문제였다 ㅠ