ํธ์ถ๋ถํธ(์ ๋ฐID) ๋ณ๋ก ์ ํญ์ผ์๊ฐ ์ฌ๋ฌ๊ฐ ์ฐํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ฌ์ฉ๋ชฉ์ (์ํ, ์ ํ, ์ ์, ์๋ฆฌ ๋ฑ)์ ๋ฐ๋ผ ๊ฐ๊ฐ์ ์ผ์ด์ค๋ฅผ ๊ตฌ๋ถํด์ ๋ณ๋ Record๋ก ๋ฐ์ดํฐ๊ฐ ์์ง๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ค๋ณต ํ ํ์ธ
๋จผ์ ํธ์ถ๋ถํธ์ ์ ํญ์ผ์ ๊ธฐ์ค์ผ๋ก ์ค๋ณต ์ปฌ๋ผ์ ๋จผ์ ํ์ธํ๋ค.
duplicate = df.duplicated(subset=['ํธ์ถ๋ถํธ', '์
ํญ์ผ์']).sum()
duplicate
-- ๊ฒฐ๊ณผ : 71439
์ค๋ณต ํ ํ์ธ
'ํธ์ถ๋ถํธ'์ '์ ํญ์ผ์' ์ด์ ๊ธฐ์ค์ผ๋ก ์ค๋ณต๋ ๋ชจ๋ ํ์ ์๋ณธ ๋ฐ์ดํฐํ๋ ์์์ ์ ํํ๊ณ , ์ด๋ฅผ duplicated_rows์ ์ ์ฅ
๐ duplicated_rows์๋ ์ค๋ณต๋ ํ๋ค๋ง ํฌํจ๋์ด ์๋ ์ํ
# ๋ชจ๋ ์ค๋ณต ํ์ ์ ํ(keep=False)
duplicated_rows = df[df.duplicated(subset=['ํธ์ถ๋ถํธ', '์
ํญ์ผ์'], keep=False)]
duplicated_rows
์ถํญ๋๊ธฐ์๊ฐ(๋ถ) ๊ณ์ฐ
(1) ์ถํญ๋๊ธฐ๊ฐ ์ฌ์ฉ๋ชฉ์ ๋ช ์ธ ๊ฒฝ์ฐ, '์ถํญ๋๊ธฐ์๊ฐ_๋ถ' ์ปฌ๋ผ ๊ฐ์ ๋ค์์ ํ ๋น
>> ์ถํญ๋๊ธฐ๊ฐ ๋ฐ์ํ ์๊ฐ์ ์ง์ ์ผ์(FROM ~ TO)๋ฅผ ์ด์ฉํ์ฌ ๊ณ์ฐ
>> dt.total_seconds() ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ๊ฐ๊ฒฉ์ '์ด' ๋ณํ
>> ๋ค์ ์ด๋ฅผ 60์ผ๋ก ๋๋์ด '๋ถ'์ผ๋ก ๋ณํ
temp.loc[temp['์ฌ์ฉ๋ชฉ์ ๋ช
'] == '์ถํญ ๋๊ธฐ', '์ถํญ๋๊ธฐ์๊ฐ_๋ถ']
= (pd.to_datetime(temp['์ง์ ์ผ์(TO)']) - pd.to_datetime(temp['์ง์ ์ผ์(FROM)'])).dt.total_seconds() / 60
(2) ์ถํญ๋๊ธฐ์๊ฐ(๋ถ)์ด ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ๋ ๊ฒฐ์ธก์น๋ก ์ฒ๋ฆฌ๋์ด, ์ด๋ฅผ 0์ผ๋ก ๋์ฒด
temp['์ถํญ๋๊ธฐ์๊ฐ_๋ถ'].fillna(0, inplace = True)
'ํธ์ถ๋ถํธ' & '์ ํญ์ผ์'๊ฐ ์ค๋ณต๋ ํ์ ๋ํฏ๊ฐ๋ง ๋จ๊ธฐ๊ธฐ โถ๏ธ groupby.agg()
- ๊ฐ๊ณต ์ปฌ๋ผ : ํธ์ถ๋ถํธ, ์ ํญ์ผ์, ์ถํญ์ผ์, ์ ์_๋๊ธฐ์๊ฐ_๋ถ, service_Time_๋ถ
- ํธ์ถ๋ถํธ, ์ ํญ์ผ์, ์ถํญ์ผ์๋ ์ค๋ณตํ๋ค ์ค์ ์ฒซ๋ฒ์งธ ๊ฐ๋ง ์ ๋ ฅ
- 'ํธ์ถ๋ถํธ','์ ํญ์ผ์'๊ฐ ์ค๋ณต๋ ํ์ค์ '์ ์_๋๊ธฐ์๊ฐ_๋ถ' ๊ฐ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ new ์ '์ ์_๋๊ธฐ์๊ฐ_๋ถ'๊ฐ์ ์ ๋ ฅ
- 'ํธ์ถ๋ถํธ','์ ํญ์ผ์'๊ฐ ์ค๋ณต๋ ํ์ค์ 'Service_Time_Start' ๊ฐ์ด ์ ์ผ ํฐ ๊ฐ์ new 'Service_Time_Start'๊ฐ์ ์ ๋ ฅ
- 'ํธ์ถ๋ถํธ','์ ํญ์ผ์'๊ฐ ์ค๋ณต๋ ํ์ค์ 'Service_Time_End' ๊ฐ์ด ์ ์ผ ์์ ๊ฐ์ new 'Service_Time_End'๊ฐ์ ์ ๋ ฅ
import pandas as pd
grouped_df = df.groupby(['ํธ์ถ๋ถํธ', '์
ํญ์ผ์']).agg({
'์ถํญ์ผ์': 'first',
'์ ์_๋๊ธฐ์๊ฐ_๋ถ': 'max',
'์ถํญ_๋๊ธฐ์๊ฐ_๋ถ': 'max',
'Service_Time_Start': 'max',
'Service_Time_End': 'min',
'๊ณ์ ์ฅ์_์ฝ๋': 'first', # ์ถ๊ฐํ ์ปฌ๋ผ(ํ์๋ ์๋์ง๋ง ์์ผ๋ฉด ์ข์)
'๊ณ์ ์ฅ์_์ซ์': 'first',
'๊ณ์ ์ฅ์๋ช
': 'first'
}).reset_index()
new_df = pd.DataFrame(grouped_df, columns=['ํธ์ถ๋ถํธ', '์
ํญ์ผ์', '์ถํญ์ผ์', '์ ์_๋๊ธฐ์๊ฐ_๋ถ', '์ถํญ_๋๊ธฐ์๊ฐ_๋ถ', 'Service_Time_Start', 'Service_Time_End', '๊ณ์ ์ฅ์_์ฝ๋', '๊ณ์ ์ฅ์_์ซ์', '๊ณ์ ์ฅ์๋ช
'])
df = new_df.copy()
์๋น์ค ์๊ฐ๊ณผ ๋๊ธฐ์จ ๊ตฌํ๊ธฐ
df['Service_Time_End'] = pd.to_datetime(df['Service_Time_End'])
df['Service_Time_Start'] = pd.to_datetime(df['Service_Time_Start'])
#์๋น์ค ์๊ฐ
df['Service_Time_๋ถ'] = (df['Service_Time_End'] - df['Service_Time_Start']).dt.total_seconds() / 60
#๋๊ธฐ์จ
df['๋๊ธฐ์จ'] = df['์ ์_๋๊ธฐ์๊ฐ_๋ถ']/df['Service_Time_๋ถ']*100