In [1]:
import pandas as pd pew = pd.read_csv('../../data/pew.csv') pew.head()
Out[1]:
religion | <$10k | $10-20k | $20-30k | $30-40k | $40-50k | $50-75k | $75-100k | $100-150k | >150k | Don't know/refused | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | Agnostic | 27 | 34 | 60 | 81 | 76 | 137 | 122 | 109 | 84 | 96 |
1 | Atheist | 12 | 27 | 37 | 52 | 35 | 70 | 73 | 59 | 74 | 76 |
2 | Buddhist | 27 | 21 | 30 | 34 | 33 | 58 | 62 | 39 | 53 | 54 |
3 | Catholic | 418 | 617 | 732 | 670 | 638 | 1116 | 949 | 792 | 633 | 1489 |
4 | Don’t know/refused | 15 | 14 | 15 | 11 | 10 | 35 | 21 | 17 | 18 | 116 |
melt메서드 인자¶
- id_vars: 위치를 그대로 유지할 열의 이름을 지정
- value_vars: 행으로 위치를 변경할 열의 이름을 지정
- var_name: value_vars로 위치를 변경할 열의 이름을 지정
- var_name으로 위치를 변경할 열의 데이터를 저장할 열의 이름을 지정
In [2]:
print(pew.iloc[:,0:6])
religion <$10k $10-20k $20-30k $30-40k $40-50k 0 Agnostic 27 34 60 81 76 1 Atheist 12 27 37 52 35 2 Buddhist 27 21 30 34 33 3 Catholic 418 617 732 670 638 4 Don’t know/refused 15 14 15 11 10 5 Evangelical Prot 575 869 1064 982 881 6 Hindu 1 9 7 9 11 7 Historically Black Prot 228 244 236 238 197 8 Jehovah's Witness 20 27 24 24 21 9 Jewish 19 19 25 25 30 10 Mainline Prot 289 495 619 655 651 11 Mormon 29 40 48 51 56 12 Muslim 6 7 9 10 9 13 Orthodox 13 17 23 32 32 14 Other Christian 9 7 11 13 13 15 Other Faiths 20 33 40 46 49 16 Other World Religions 5 2 3 4 2 17 Unaffiliated 217 299 374 365 341
In [3]:
#religion 열을 고정하여 피벗했다. pew_long=pd.melt(pew, id_vars='religion') print(pew_long.head()) print(pew_long.tail())
religion variable value 0 Agnostic <$10k 27 1 Atheist <$10k 12 2 Buddhist <$10k 27 3 Catholic <$10k 418 4 Don’t know/refused <$10k 15 religion variable value 175 Orthodox Don't know/refused 73 176 Other Christian Don't know/refused 18 177 Other Faiths Don't know/refused 71 178 Other World Religions Don't know/refused 8 179 Unaffiliated Don't know/refused 597
In [4]:
pew_long=pd.melt(pew, id_vars='religion', var_name='income', value_name='count') pew_long.head()
Out[4]:
religion | income | count | |
---|---|---|---|
0 | Agnostic | <$10k | 27 |
1 | Atheist | <$10k | 12 |
2 | Buddhist | <$10k | 27 |
3 | Catholic | <$10k | 418 |
4 | Don’t know/refused | <$10k | 15 |
In [5]:
## 2개 이상의 열을 고정하고 나머지 열을 행으로 바꾸기
In [6]:
billboard =pd.read_csv('../../data/billboard.csv') billboard.iloc[0:5, 0:16]
Out[6]:
year | artist | track | time | date.entered | wk1 | wk2 | wk3 | wk4 | wk5 | wk6 | wk7 | wk8 | wk9 | wk10 | wk11 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | 87 | 82.0 | 72.0 | 77.0 | 87.0 | 94.0 | 99.0 | NaN | NaN | NaN | NaN |
1 | 2000 | 2Ge+her | The Hardest Part Of ... | 3:15 | 2000-09-02 | 91 | 87.0 | 92.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | 2000 | 3 Doors Down | Kryptonite | 3:53 | 2000-04-08 | 81 | 70.0 | 68.0 | 67.0 | 66.0 | 57.0 | 54.0 | 53.0 | 51.0 | 51.0 | 51.0 |
3 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | 76 | 76.0 | 72.0 | 69.0 | 67.0 | 65.0 | 55.0 | 59.0 | 62.0 | 61.0 | 61.0 |
4 | 2000 | 504 Boyz | Wobble Wobble | 3:35 | 2000-04-15 | 57 | 34.0 | 25.0 | 17.0 | 17.0 | 31.0 | 36.0 | 49.0 | 53.0 | 57.0 | 64.0 |
In [7]:
billboard_long=pd.melt(billboard, id_vars=['year', 'artist', 'track', 'time', 'date.entered'], var_name='week', value_name='rating') billboard_long.head()
Out[7]:
year | artist | track | time | date.entered | week | rating | |
---|---|---|---|---|---|---|---|
0 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk1 | 87.0 |
1 | 2000 | 2Ge+her | The Hardest Part Of ... | 3:15 | 2000-09-02 | wk1 | 91.0 |
2 | 2000 | 3 Doors Down | Kryptonite | 3:53 | 2000-04-08 | wk1 | 81.0 |
3 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk1 | 76.0 |
4 | 2000 | 504 Boyz | Wobble Wobble | 3:35 | 2000-04-15 | wk1 | 57.0 |
ebola 데이터 집합 살펴보기¶
In [8]:
#Cases_Guinea : 발병국가, Cases_guinea : 발병국가, Cases_Guinea : 사망자 수, 나라 이름-열 ebola=pd.read_csv('../../data/country_timeseries.csv') print(ebola.columns)
Index(['Date', 'Day', 'Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone', 'Cases_Nigeria', 'Cases_Senegal', 'Cases_UnitedStates', 'Cases_Spain', 'Cases_Mali', 'Deaths_Guinea', 'Deaths_Liberia', 'Deaths_SierraLeone', 'Deaths_Nigeria', 'Deaths_Senegal', 'Deaths_UnitedStates', 'Deaths_Spain', 'Deaths_Mali'], dtype='object')
In [9]:
ebola.iloc[:5, [0, 1, 2, 3, 10, 11]]
Out[9]:
Date | Day | Cases_Guinea | Cases_Liberia | Deaths_Guinea | Deaths_Liberia | |
---|---|---|---|---|---|---|
0 | 1/5/2015 | 289 | 2776.0 | NaN | 1786.0 | NaN |
1 | 1/4/2015 | 288 | 2775.0 | NaN | 1781.0 | NaN |
2 | 1/3/2015 | 287 | 2769.0 | 8166.0 | 1767.0 | 3496.0 |
3 | 1/2/2015 | 286 | NaN | 8157.0 | NaN | 3496.0 |
4 | 12/31/2014 | 284 | 2730.0 | 8115.0 | 1739.0 | 3471.0 |
In [10]:
ebola_iong=pd.melt(ebola, id_vars=['Date', 'Day']) ebola_iong.head()
Out[10]:
Date | Day | variable | value | |
---|---|---|---|---|
0 | 1/5/2015 | 289 | Cases_Guinea | 2776.0 |
1 | 1/4/2015 | 288 | Cases_Guinea | 2775.0 |
2 | 1/3/2015 | 287 | Cases_Guinea | 2769.0 |
3 | 1/2/2015 | 286 | Cases_Guinea | NaN |
4 | 12/31/2014 | 284 | Cases_Guinea | 2730.0 |
In [11]:
## 열 이름 분리하고 데이터 프레임에 추가하기
In [12]:
#split 메서드에 '_'를 전달 Cases, Guinea로 분리 variable_split = ebola_iong.variable.str.split('_') print(variable_split[:5])
0 [Cases, Guinea] 1 [Cases, Guinea] 2 [Cases, Guinea] 3 [Cases, Guinea] 4 [Cases, Guinea] Name: variable, dtype: object
In [13]:
print(type(variable_split))
<class 'pandas.core.series.Series'>
In [14]:
print(type(variable_split[0]))
<class 'list'>
In [15]:
#get메서드를 사용하여 0,1번째 인덱스의 데이터를 추출 status_values = variable_split.str.get(0) country_values = variable_split.str.get(1) print(status_values[:5])
0 Cases 1 Cases 2 Cases 3 Cases 4 Cases Name: variable, dtype: object
In [16]:
print(status_values[-5:])
1947 Deaths 1948 Deaths 1949 Deaths 1950 Deaths 1951 Deaths Name: variable, dtype: object
In [17]:
print(country_values[:5])
0 Guinea 1 Guinea 2 Guinea 3 Guinea 4 Guinea Name: variable, dtype: object
In [18]:
print(country_values[-5:])
1947 Mali 1948 Mali 1949 Mali 1950 Mali 1951 Mali Name: variable, dtype: object
In [19]:
ebola_iong['status'] = status_values ebola_iong['country'] = country_values ebola_iong.head()
Out[19]:
Date | Day | variable | value | status | country | |
---|---|---|---|---|---|---|
0 | 1/5/2015 | 289 | Cases_Guinea | 2776.0 | Cases | Guinea |
1 | 1/4/2015 | 288 | Cases_Guinea | 2775.0 | Cases | Guinea |
2 | 1/3/2015 | 287 | Cases_Guinea | 2769.0 | Cases | Guinea |
3 | 1/2/2015 | 286 | Cases_Guinea | NaN | Cases | Guinea |
4 | 12/31/2014 | 284 | Cases_Guinea | 2730.0 | Cases | Guinea |
concat 메서드를 응용하여 데이터 프레임에 열 추가하기¶
In [20]:
#concat 메서드를 활용하면 split메서드로 분리한 데이터를 바로 df에 추가 #분할된 개별 리스트를 바로 df로 만드려면 expand=True 옵션을 추가 variable_split = ebola_iong.variable.str.split('_', expand=True) variable_split.columns = ['status', 'country'] ebola_parsed = pd.concat([ebola_iong, variable_split], axis=1) ebola_parsed.head()
Out[20]:
Date | Day | variable | value | status | country | status | country | |
---|---|---|---|---|---|---|---|---|
0 | 1/5/2015 | 289 | Cases_Guinea | 2776.0 | Cases | Guinea | Cases | Guinea |
1 | 1/4/2015 | 288 | Cases_Guinea | 2775.0 | Cases | Guinea | Cases | Guinea |
2 | 1/3/2015 | 287 | Cases_Guinea | 2769.0 | Cases | Guinea | Cases | Guinea |
3 | 1/2/2015 | 286 | Cases_Guinea | NaN | Cases | Guinea | Cases | Guinea |
4 | 12/31/2014 | 284 | Cases_Guinea | 2730.0 | Cases | Guinea | Cases | Guinea |
기상 데이터의 여러 열을 하나로 정리 - melt, pivot_table 메서드¶
In [21]:
# 날짜 열(d1, d2, d3...) 각 월별 최고, 최저 온도 데이터 weather = pd.read_csv('../../data/weather.csv') print(weather.iloc[:5, :11])
id year month element d1 d2 d3 d4 d5 d6 d7 0 MX17004 2010 1 tmax NaN NaN NaN NaN NaN NaN NaN 1 MX17004 2010 1 tmin NaN NaN NaN NaN NaN NaN NaN 2 MX17004 2010 2 tmax NaN 27.3 24.1 NaN NaN NaN NaN 3 MX17004 2010 2 tmin NaN 14.4 14.4 NaN NaN NaN NaN 4 MX17004 2010 3 tmax NaN NaN NaN NaN 32.1 NaN NaN
In [22]:
weather_melt = pd.melt(weather, id_vars=['id', 'year', 'month', 'element'], var_name='day', value_name='temp')
In [23]:
weather_tidy = weather_melt.pivot_table( index=['id', 'year', 'month', 'day'], columns = 'element', values='temp' ) weather_tidy
Out[23]:
element | tmax | tmin | |||
---|---|---|---|---|---|
id | year | month | day | ||
MX17004 | 2010 | 1 | d30 | 27.8 | 14.5 |
2 | d11 | 29.7 | 13.4 | ||
d2 | 27.3 | 14.4 | |||
d23 | 29.9 | 10.7 | |||
d3 | 24.1 | 14.4 | |||
3 | d10 | 34.5 | 16.8 | ||
d16 | 31.1 | 17.6 | |||
d5 | 32.1 | 14.2 | |||
4 | d27 | 36.3 | 16.7 | ||
5 | d27 | 33.2 | 18.2 | ||
6 | d17 | 28.0 | 17.5 | ||
d29 | 30.1 | 18.0 | |||
7 | d3 | 28.6 | 17.5 | ||
d14 | 29.9 | 16.5 | |||
8 | d23 | 26.4 | 15.0 | ||
d5 | 29.6 | 15.8 | |||
d29 | 28.0 | 15.3 | |||
d13 | 29.8 | 16.5 | |||
d25 | 29.7 | 15.6 | |||
d31 | 25.4 | 15.4 | |||
d8 | 29.0 | 17.3 | |||
10 | d5 | 27.0 | 14.0 | ||
d14 | 29.5 | 13.0 | |||
d15 | 28.7 | 10.5 | |||
d28 | 31.2 | 15.0 | |||
d7 | 28.1 | 12.9 | |||
11 | d2 | 31.3 | 16.3 | ||
d5 | 26.3 | 7.9 | |||
d27 | 27.7 | 14.2 | |||
d26 | 28.1 | 12.1 | |||
d4 | 27.2 | 12.0 | |||
12 | d1 | 29.9 | 13.8 | ||
d6 | 27.8 | 10.5 |
In [24]:
# weather_tidy.index
In [25]:
# reset_index: 기존의 행 인덱스를 제거하고 인덱스를 데이터 열로 추가 weather_tidy_flat = weather_tidy.reset_index() weather_tidy_flat
Out[25]:
element | id | year | month | day | tmax | tmin |
---|---|---|---|---|---|---|
0 | MX17004 | 2010 | 1 | d30 | 27.8 | 14.5 |
1 | MX17004 | 2010 | 2 | d11 | 29.7 | 13.4 |
2 | MX17004 | 2010 | 2 | d2 | 27.3 | 14.4 |
3 | MX17004 | 2010 | 2 | d23 | 29.9 | 10.7 |
4 | MX17004 | 2010 | 2 | d3 | 24.1 | 14.4 |
5 | MX17004 | 2010 | 3 | d10 | 34.5 | 16.8 |
6 | MX17004 | 2010 | 3 | d16 | 31.1 | 17.6 |
7 | MX17004 | 2010 | 3 | d5 | 32.1 | 14.2 |
8 | MX17004 | 2010 | 4 | d27 | 36.3 | 16.7 |
9 | MX17004 | 2010 | 5 | d27 | 33.2 | 18.2 |
10 | MX17004 | 2010 | 6 | d17 | 28.0 | 17.5 |
11 | MX17004 | 2010 | 6 | d29 | 30.1 | 18.0 |
12 | MX17004 | 2010 | 7 | d3 | 28.6 | 17.5 |
13 | MX17004 | 2010 | 7 | d14 | 29.9 | 16.5 |
14 | MX17004 | 2010 | 8 | d23 | 26.4 | 15.0 |
15 | MX17004 | 2010 | 8 | d5 | 29.6 | 15.8 |
16 | MX17004 | 2010 | 8 | d29 | 28.0 | 15.3 |
17 | MX17004 | 2010 | 8 | d13 | 29.8 | 16.5 |
18 | MX17004 | 2010 | 8 | d25 | 29.7 | 15.6 |
19 | MX17004 | 2010 | 8 | d31 | 25.4 | 15.4 |
20 | MX17004 | 2010 | 8 | d8 | 29.0 | 17.3 |
21 | MX17004 | 2010 | 10 | d5 | 27.0 | 14.0 |
22 | MX17004 | 2010 | 10 | d14 | 29.5 | 13.0 |
23 | MX17004 | 2010 | 10 | d15 | 28.7 | 10.5 |
24 | MX17004 | 2010 | 10 | d28 | 31.2 | 15.0 |
25 | MX17004 | 2010 | 10 | d7 | 28.1 | 12.9 |
26 | MX17004 | 2010 | 11 | d2 | 31.3 | 16.3 |
27 | MX17004 | 2010 | 11 | d5 | 26.3 | 7.9 |
28 | MX17004 | 2010 | 11 | d27 | 27.7 | 14.2 |
29 | MX17004 | 2010 | 11 | d26 | 28.1 | 12.1 |
30 | MX17004 | 2010 | 11 | d4 | 27.2 | 12.0 |
31 | MX17004 | 2010 | 12 | d1 | 29.9 | 13.8 |
32 | MX17004 | 2010 | 12 | d6 | 27.8 | 10.5 |
빌보드 차트의 중복 데이터 처리¶
In [26]:
billboard = pd.read_csv('../../data/billboard.csv') billboard_long =pd.melt(billboard, id_vars= ['year', 'artist', 'track', 'time', 'date.entered'], var_name = 'week', value_name="rating") print(billboard_long.shape) billboard_long.head()
(24092, 7)
Out[26]:
year | artist | track | time | date.entered | week | rating | |
---|---|---|---|---|---|---|---|
0 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk1 | 87.0 |
1 | 2000 | 2Ge+her | The Hardest Part Of ... | 3:15 | 2000-09-02 | wk1 | 91.0 |
2 | 2000 | 3 Doors Down | Kryptonite | 3:53 | 2000-04-08 | wk1 | 81.0 |
3 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk1 | 76.0 |
4 | 2000 | 504 Boyz | Wobble Wobble | 3:35 | 2000-04-15 | wk1 | 57.0 |
In [27]:
# 중복 데이터를 가지고 있는 year, artist, track, time 열을 따로 모아 df에 저장 billboard_long[billboard_long.track == 'Loser'].head()
Out[27]:
year | artist | track | time | date.entered | week | rating | |
---|---|---|---|---|---|---|---|
3 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk1 | 76.0 |
320 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk2 | 76.0 |
637 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk3 | 72.0 |
954 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk4 | 69.0 |
1271 | 2000 | 3 Doors Down | Loser | 4:24 | 2000-10-21 | wk5 | 67.0 |
In [28]:
billboard_songs = billboard_long[['year', 'artist', 'track', 'time']] billboard_songs.shape
Out[28]:
(24092, 4)
In [29]:
# drop_duplicates 메서드로 df의 중복 데이터 제거 billboard_songs = billboard_songs.drop_duplicates() billboard_songs.shape
Out[29]:
(317, 4)
In [30]:
a = range(len(billboard_songs)) a
Out[30]:
range(0, 317)
In [31]:
billboard_songs['id'] = range(len(billboard_songs)) billboard_songs.head(n=10)
Out[31]:
year | artist | track | time | id | |
---|---|---|---|---|---|
0 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 0 |
1 | 2000 | 2Ge+her | The Hardest Part Of ... | 3:15 | 1 |
2 | 2000 | 3 Doors Down | Kryptonite | 3:53 | 2 |
3 | 2000 | 3 Doors Down | Loser | 4:24 | 3 |
4 | 2000 | 504 Boyz | Wobble Wobble | 3:35 | 4 |
5 | 2000 | 98^0 | Give Me Just One Nig... | 3:24 | 5 |
6 | 2000 | A*Teens | Dancing Queen | 3:44 | 6 |
7 | 2000 | Aaliyah | I Don't Wanna | 4:15 | 7 |
8 | 2000 | Aaliyah | Try Again | 4:03 | 8 |
9 | 2000 | Adams, Yolanda | Open My Heart | 5:30 | 9 |
In [32]:
billboard_ratings = billboard_long.merge(billboard_songs, on=['year', 'artist', 'track', 'time']) billboard_ratings
Out[32]:
year | artist | track | time | date.entered | week | rating | id | |
---|---|---|---|---|---|---|---|---|
0 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk1 | 87.0 | 0 |
1 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk2 | 82.0 | 0 |
2 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk3 | 72.0 | 0 |
3 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk4 | 77.0 | 0 |
4 | 2000 | 2 Pac | Baby Don't Cry (Keep... | 4:22 | 2000-02-26 | wk5 | 87.0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
24087 | 2000 | matchbox twenty | Bent | 4:12 | 2000-04-29 | wk72 | NaN | 316 |
24088 | 2000 | matchbox twenty | Bent | 4:12 | 2000-04-29 | wk73 | NaN | 316 |
24089 | 2000 | matchbox twenty | Bent | 4:12 | 2000-04-29 | wk74 | NaN | 316 |
24090 | 2000 | matchbox twenty | Bent | 4:12 | 2000-04-29 | wk75 | NaN | 316 |
24091 | 2000 | matchbox twenty | Bent | 4:12 | 2000-04-29 | wk76 | NaN | 316 |
24092 rows × 8 columns
반응형
'데이터분석' 카테고리의 다른 글
[23.06.16] Python apply, 문제 - 11(4) (0) | 2023.06.16 |
---|---|
[23.06.16] Python pivot_table - 11(2) (0) | 2023.06.16 |
[23.06.15] Python 누락 값 처리 - 10(3) (0) | 2023.06.15 |
[23.06.15] Python merge - 10(2) (0) | 2023.06.15 |
[23.06.15] Python concat - 10(1) (0) | 2023.06.15 |