[판다스 / 주피터 / 미국 대통령 데이터 뽑기 / 판다스 계산 / 데이터 프레임]
[예제] 미국 대통령 당선 정보에서 정당 정보를 도출하여 시각하 하기¶
* 불러온 데이타집합의 정보 확인하기¶
- type(df) : 데이타 타입
- df.shape : 행과 열의 수
- df.columns : 컬럼명 확인
- df.dtypes : 각각의 컬럼 데이타타입
- df.info() : df.dtypes 비슷
- df.info
- df.head()
- df.tail()
파이썬과 판다스 자료형 비교¶
int int64
float float64
string object(****)
당선된 각 정당(Political Party) 수를 먼저 구해야 한다¶
- value_counts() 이용
- 원그래프 출력
[연습] 데이타셋에서 다른 인사이드를 도출하여 시각화하기¶
In [1]:
import pandas as pd
In [2]:
df = pd.read_excel('http://qrc.depaul.edu/excel_files/presidents.xlsx')
In [ ]:
### [참고] 웹에서 제공하는 데이타를 다운로드하기
# import urllib.request as req
# local = './data/president/presidents.xlsx' # data폴더 밑에 president 폴더가 있어야 한다
# url = 'http://qrc.depaul.edu/excel_files/presidents.xlsx'
# req.urlretrieve(url,local)
# print('다운로드 완료')
데이타 정보 확인하기¶
- print(type(df)) # 데이타 타입
- print(df.shape) # 행과 열의 수
- print(df.columns) # 컬럼명 확인
- print(df.dtypes) # 각각의 컬럼 데이타타입
- print(df.info()) # df.dtypes 비슷
- print(df.info) # 전체적인 내용을???
- print(df.head())
- print(df.tail())
* 인사이트를 도출하여 정보를 추출하고 시각화¶
In [32]:
df
Out[32]:
President | Years in office | Year first inaugurated | Age at inauguration | State elected from | # of electoral votes | # of popular votes | National total votes | Total electoral votes | Rating points | Political Party | Occupation | College | % electoral | % popular | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | George Washington | 8.0 | 1789 | 57 | Virginia | 69 | NA() | NA() | 69 | 842.0 | None | Planter | None | 100.000000 | NA() |
1 | John Adams | 4.0 | 1797 | 61 | Massachusetts | 132 | NA() | NA() | 139 | 598.0 | Federalist | Lawyer | Harvard | 94.964029 | NA() |
2 | Thomas Jefferson | 8.0 | 1801 | 57 | Virginia | 73 | NA() | NA() | 137 | 711.0 | Democratic-Republican | Planter, Lawyer | William and Mary | 53.284672 | NA() |
3 | James Madison | 8.0 | 1809 | 57 | Virginia | 122 | NA() | NA() | 176 | 567.0 | Democratic-Republican | Lawyer | Princeton | 69.318182 | NA() |
4 | James Monroe | 8.0 | 1817 | 58 | Virginia | 183 | NA() | NA() | 221 | 602.0 | Democratic-Republican | Lawyer | William and Mary | 82.805430 | NA() |
5 | John Quincy Adams | 4.0 | 1825 | 57 | Massachusetts | 84 | NA() | NA() | 261 | 564.0 | Democratic-Republican | Lawyer | Harvard | 32.183908 | NA() |
6 | Andrew Jackson | 8.0 | 1829 | 61 | Tennessee | 178 | 642553 | 1148018 | 261 | 632.0 | Democrat | Lawyer | None | 68.199234 | 55.970638 |
7 | Martin Van Buren | 4.0 | 1837 | 54 | New York | 170 | 764176 | 1503534 | 294 | 429.0 | Democrat | Lawyer | None | 57.823129 | 50.825322 |
8 | William Henry Harrison | 0.8 | 1841 | 68 | Ohio | 234 | 1275390 | 2411808 | 294 | 329.0 | Whig | Soldier | Hampden-Sydney | 79.591837 | 52.881075 |
9 | James K. Polk | 4.0 | 1845 | 49 | Tennessee | 170 | 1339494 | 2703659 | 275 | 632.0 | Democrat | Lawyer | U. of North Carolina | 61.818182 | 49.543748 |
10 | Zachary Taylor | 1.0 | 1849 | 64 | Louisiana | 163 | 1361393 | 2879184 | 290 | 447.0 | Whig | Soldier | None | 56.206897 | 47.283987 |
11 | Franklin Pierce | 4.0 | 1853 | 48 | New Hampshire | 254 | 1607510 | 3161830 | 296 | 286.0 | Democrat | Lawyer | Bowdoin | 85.810811 | 50.841127 |
12 | James Buchanan | 4.0 | 1857 | 65 | Pennsylvania | 174 | 1836072 | 4054647 | 296 | 259.0 | Democrat | Lawyer | Dickinson | 58.783784 | 45.283153 |
13 | Abraham Lincoln | 4.0 | 1861 | 52 | Illinois | 180 | 1865908 | 4685561 | 303 | 900.0 | Republican | Lawyer | None | 59.405941 | 39.82251 |
14 | Ulysses S. Grant | 8.0 | 1869 | 46 | Illinois | 214 | 3013650 | 5722440 | 294 | 403.0 | Republican | Soldier | US Military Academy | 72.789116 | 52.663724 |
15 | Rutherford B. Hayes | 4.0 | 1877 | 54 | Ohio | 185 | 4034311 | 8413101 | 369 | 477.0 | Republican | Lawyer | Kenyon | 50.135501 | 47.952723 |
16 | James A. Garfield | 0.5 | 1881 | 49 | Ohio | 214 | 4446158 | 9210420 | 369 | 444.0 | Republican | Lawyer | Williams | 57.994580 | 48.27313 |
17 | Grover Cleveland | 4.0 | 1885 | 47 | New York | 219 | 4874621 | 10049754 | 401 | 576.0 | Democrat | Lawyer | None | 54.613466 | 48.504879 |
18 | Benjamin Harrison | 4.0 | 1889 | 55 | Indiana | 233 | 5443892 | 11383320 | 401 | 426.0 | Republican | Lawyer | Miami | 58.104738 | 47.823412 |
19 | Grover Cleveland | 4.0 | 1893 | 55 | New York | 277 | 5551883 | 12056097 | 444 | 576.0 | Democrat | Lawyer | None | 62.387387 | 46.050417 |
20 | William McKinley | 4.0 | 1897 | 54 | Ohio | 271 | 7108480 | 13935738 | 447 | 601.0 | Republican | Lawyer | Allegheny College | 60.626398 | 51.008996 |
21 | William Howard Taft | 4.0 | 1909 | 51 | Ohio | 321 | 7676258 | 14882734 | 483 | 491.0 | Republican | Lawyer | Yale | 66.459627 | 51.578279 |
22 | Woodrow Wilson | 8.0 | 1913 | 56 | New Jersey | 435 | 6293152 | 15040963 | 531 | 723.0 | Democrat | Educator | Princeton | 81.920904 | 41.840087 |
23 | Warren G. Harding | 2.0 | 1921 | 55 | Ohio | 404 | 16133314 | 26753786 | 531 | 326.0 | Republican | Editor | None | 76.082863 | 60.302919 |
24 | Herbert Hoover | 4.0 | 1929 | 54 | California | 444 | 21411991 | 36790364 | 531 | 400.0 | Republican | Engineer | Stanford | 83.615819 | 58.199998 |
25 | Franklin Roosevelt | 12.0 | 1933 | 51 | New York | 472 | 22825016 | 39749382 | 531 | 876.0 | Democrat | Lawyer | Harvard | 88.888889 | 57.422317 |
26 | Dwight D. Eisenhower | 8.0 | 1953 | 62 | New York | 442 | 33936137 | 61551118 | 531 | 699.0 | Republican | Soldier | US Military Academy | 83.239171 | 55.134883 |
27 | John F. Kennedy | 3.0 | 1961 | 43 | Massachusetts | 303 | 34221344 | 68828960 | 537 | 704.0 | Democrat | Author | Harvard | 56.424581 | 49.719397 |
28 | Richard M. Nixon | 5.0 | 1969 | 56 | New York | 301 | 31785148 | 73203370 | 538 | 477.0 | Republican | Lawyer | Whittier | 55.947955 | 43.420334 |
29 | Jimmy Carter | 4.0 | 1977 | 52 | Georgia | 297 | 40830763 | 81555889 | 538 | 518.0 | Democrat | Businessman | US Naval Academy | 55.204461 | 50.064764 |
30 | Ronald Reagan | 8.0 | 1981 | 69 | California | 489 | 43904153 | 86515221 | 538 | 634.0 | Republican | Actor | Eureka College | 90.892193 | 50.747316 |
31 | George Bush | 4.0 | 1989 | 64 | Texas | 426 | 48886097 | 91584820 | 538 | 548.0 | Republican | Businessman | Yale | 79.182156 | 53.377947 |
32 | Bill Clinton | 8.0 | 1993 | 46 | Arkansas | 370 | 44909326 | 104425014 | 538 | 539.0 | Democrat | Lawyer | Georgetown | 68.773234 | 43.006292 |
33 | George W. Bush | 8.0 | 2001 | 54 | Texas | 271 | 50460110 | 105417258 | 538 | NaN | Republican | Businessman | Yale | 50.371747 | 47.86703 |
34 | Barack Obama | NaN | 2009 | 47 | Illinois | 365 | 69492376 | 129438754 | 538 | NaN | Democrat | Lawyer | Columbia University | 67.843866 | 53.687457 |
In [5]:
print(df.shape)
(35, 15)
In [6]:
print(df.columns)
Index(['President', 'Years in office', 'Year first inaugurated',
'Age at inauguration', 'State elected from', '# of electoral votes',
'# of popular votes', 'National total votes', 'Total electoral votes',
'Rating points', 'Political Party', 'Occupation', 'College',
'% electoral', '% popular'],
dtype='object')
In [7]:
print(df.dtypes)
President object
Years in office float64
Year first inaugurated int64
Age at inauguration int64
State elected from object
# of electoral votes int64
# of popular votes object
National total votes object
Total electoral votes int64
Rating points float64
Political Party object
Occupation object
College object
% electoral float64
% popular object
dtype: object
In [34]:
df_rating = df['Rating points']
df_rating.head()
Out[34]:
0 842.0
1 598.0
2 711.0
3 567.0
4 602.0
Name: Rating points, dtype: float64
Rating Point¶
In [35]:
df_rating.plot()
Out[35]:
<AxesSubplot:>
In [13]:
df.describe()
Out[13]:
Years in office | Year first inaugurated | Age at inauguration | # of electoral votes | Total electoral votes | Rating points | % electoral | |
---|---|---|---|---|---|---|---|
count | 34.000000 | 35.000000 | 35.000000 | 35.000000 | 35.000000 | 33.000000 | 35.000000 |
mean | 5.185294 | 1892.542857 | 55.085714 | 261.114286 | 385.085714 | 552.606061 | 68.048420 |
std | 2.638426 | 64.758530 | 6.381828 | 118.620198 | 143.817567 | 159.117280 | 15.092928 |
min | 0.500000 | 1789.000000 | 43.000000 | 69.000000 | 69.000000 | 259.000000 | 32.183908 |
25% | 4.000000 | 1843.000000 | 51.000000 | 176.000000 | 292.000000 | 444.000000 | 57.123855 |
50% | 4.000000 | 1885.000000 | 55.000000 | 234.000000 | 401.000000 | 564.000000 | 66.459627 |
75% | 8.000000 | 1943.000000 | 57.500000 | 343.000000 | 531.000000 | 632.000000 | 80.756370 |
max | 12.000000 | 2009.000000 | 69.000000 | 489.000000 | 538.000000 | 900.000000 | 100.000000 |
In [87]:
df.head()
Out[87]:
President | Years in office | Year first inaugurated | Age at inauguration | State elected from | # of electoral votes | # of popular votes | National total votes | Total electoral votes | Rating points | Political Party | Occupation | College | % electoral | % popular | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | George Washington | 8.0 | 1789 | 57 | Virginia | 69 | NA() | NA() | 69 | 842.0 | None | Planter | None | 100.000000 | NA() |
1 | John Adams | 4.0 | 1797 | 61 | Massachusetts | 132 | NA() | NA() | 139 | 598.0 | Federalist | Lawyer | Harvard | 94.964029 | NA() |
2 | Thomas Jefferson | 8.0 | 1801 | 57 | Virginia | 73 | NA() | NA() | 137 | 711.0 | Democratic-Republican | Planter, Lawyer | William and Mary | 53.284672 | NA() |
3 | James Madison | 8.0 | 1809 | 57 | Virginia | 122 | NA() | NA() | 176 | 567.0 | Democratic-Republican | Lawyer | Princeton | 69.318182 | NA() |
4 | James Monroe | 8.0 | 1817 | 58 | Virginia | 183 | NA() | NA() | 221 | 602.0 | Democratic-Republican | Lawyer | William and Mary | 82.805430 | NA() |
In [85]:
df['Total electoral votes'].plot() #선거인단 수
Out[85]:
<AxesSubplot:>
In [77]:
df['Age at inauguration'].plot(kind='hist') #취임나이 hist
Out[77]:
<AxesSubplot:ylabel='Frequency'>
In [81]:
df['Age at inauguration'].plot(kind='kde') # 취임나이
Out[81]:
<AxesSubplot:ylabel='Density'>
In [63]:
df['Years in office'].plot(kind='hist') #재임년수
Out[63]:
<AxesSubplot:ylabel='Frequency'>
In [88]:
df.groupby('Total electoral votes').count().plot()
Out[88]:
<AxesSubplot:xlabel='Total electoral votes'>
취임나이별 재임년수¶
In [107]:
temp = df[['Age at inauguration','Years in office']]
temp.plot(kind='bar')
Out[107]:
<AxesSubplot:>
In [135]:
import matplotlib.pyplot as plt
df2 = df[['President','College']]
df3 = df[['College','Age at inauguration']]
대학별 대통령 배출 그래프¶
In [132]:
df_pre = df2.groupby('College').count()
df_pre.plot(kind='barh')
Out[132]:
<AxesSubplot:ylabel='College'>
대학별 대통령의 평균 취임나이¶
In [142]:
df3 = df[['College','Age at inauguration']] # 데이터에서 컬럼뽑기
df_pre2 = df3.groupby('College').mean() #평균치 값 df_pre2에 넣기
df_pre2.plot(kind='barh') # plot
Out[142]:
<AxesSubplot:ylabel='College'>
In [1]:
# Series 연산
from pandas import Series
s1 = Series([10, 15, 20], index=['일','이','삼'])
s2 = Series([2,4,6,8], index=['일','이','삼','사'])
print(s1)
print(s2)
일 10
이 15
삼 20
dtype: int64
일 2
이 4
삼 6
사 8
dtype: int64
In [2]:
s1 + 5
Out[2]:
일 15
이 20
삼 25
dtype: int64
In [3]:
s1 + s2
Out[3]:
사 NaN
삼 26.0
이 19.0
일 12.0
dtype: float64
In [4]:
s3 = Series([1,2,3],index=['1줄','2줄','3줄'])
In [5]:
s1 + s3
#같은 인덱스 값이 없으니 NaN 값이 뜬다.
Out[5]:
1줄 NaN
2줄 NaN
3줄 NaN
삼 NaN
이 NaN
일 NaN
dtype: float64
In [7]:
# DataFrame 연산
from pandas import DataFrame
import numpy as np
df1 = DataFrame(np.zeros((3,3), dtype='int32'), index=['one','two','three'])
df1 + 3 #각 요소에 3이 더해짐
Out[7]:
0 | 1 | 2 | |
---|---|---|---|
one | 3 | 3 | 3 |
two | 3 | 3 | 3 |
three | 3 | 3 | 3 |
In [ ]:
In [8]:
df3 = DataFrame(np.ones((4,4), dtype='int32'), index=['one','two','three','four'])
df3
Out[8]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
one | 1 | 1 | 1 | 1 |
two | 1 | 1 | 1 | 1 |
three | 1 | 1 | 1 | 1 |
four | 1 | 1 | 1 | 1 |
In [9]:
df3 + df1
#같은 인덱스를 가지고 있는 값들은 연산이 됨, 인덱스가 중요, 결측치(NaN)출력
Out[9]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
four | NaN | NaN | NaN | NaN |
one | 1.0 | 1.0 | 1.0 | NaN |
three | 1.0 | 1.0 | 1.0 | NaN |
two | 1.0 | 1.0 | 1.0 | NaN |
In [11]:
df3.add(df1, fill_value=0)
# add함수의 기능 fill_value 값이 없는거에 0이 채워지니까 연산이 됨
Out[11]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
four | 1.0 | 1.0 | 1.0 | 1.0 |
one | 1.0 | 1.0 | 1.0 | 1.0 |
three | 1.0 | 1.0 | 1.0 | 1.0 |
two | 1.0 | 1.0 | 1.0 | 1.0 |
In [ ]:
# add() / sub()/ mul()/ div()
문자열이 있는 데이타프레임의 연산
In [12]:
mydata = {
'name':['홍길동','박길동','김길동'],
'age':[22,33,44],
'dept':['컴공','국어','산업']
}
df = DataFrame(mydata)
df
Out[12]:
name | age | dept | |
---|---|---|---|
0 | 홍길동 | 22 | 컴공 |
1 | 박길동 | 33 | 국어 |
2 | 김길동 | 44 | 산업 |
In [16]:
#df + 100 ERROR
#df + str(100) ERROR
df * 3
Out[16]:
name | age | dept | |
---|---|---|---|
0 | 홍길동홍길동홍길동 | 66 | 컴공컴공컴공 |
1 | 박길동박길동박길동 | 99 | 국어국어국어 |
2 | 김길동김길동김길동 | 132 | 산업산업산업 |
In [2]:
# pandas 기술 통계 확인
from pandas import DataFrame
df=DataFrame({'거래처':['A매장','B매장','C매장','A매장','C매장','C매장', 'C매장', 'C매장'],
'주문량':[100,25, 40, 55, 137, 70, 80, 89],
'할인율':[0.1, 0.3, 0.03, 0.07, 0.15, 0.2, 0.2, 0.2]})
df
Out[2]:
거래처 | 주문량 | 할인율 | |
---|---|---|---|
0 | A매장 | 100 | 0.10 |
1 | B매장 | 25 | 0.30 |
2 | C매장 | 40 | 0.03 |
3 | A매장 | 55 | 0.07 |
4 | C매장 | 137 | 0.15 |
5 | C매장 | 70 | 0.20 |
6 | C매장 | 80 | 0.20 |
7 | C매장 | 89 | 0.20 |
In [6]:
df.shape
df.info()
df.describe()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8 entries, 0 to 7
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 거래처 8 non-null object
1 주문량 8 non-null int64
2 할인율 8 non-null float64
dtypes: float64(1), int64(1), object(1)
memory usage: 320.0+ bytes
Out[6]:
주문량 | 할인율 | |
---|---|---|
count | 8.000000 | 8.000000 |
mean | 74.500000 | 0.156250 |
std | 35.532681 | 0.087004 |
min | 25.000000 | 0.030000 |
25% | 51.250000 | 0.092500 |
50% | 75.000000 | 0.175000 |
75% | 91.750000 | 0.200000 |
max | 137.000000 | 0.300000 |
[ 연습]¶
- 총합
- 평균
- 요약통계량
- 누적합
- 주문량 * 할인율
- 주문량만 누적합 구하기
- 거래처별 거래 수를 구하고 그래프로 출력
count() sum() mean() std() var() min() max() cumsum() cumprod() describe() : 요약통계량 cf_
In [62]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
%matplotlib inline
df2 = df[['거래처','주문량']]
df2.groupby('거래처').count()
df2.plot(kind="bar")
#cnt =df['거래처'].value_counts()
#cnt
#cnt.plot(kind='bar');
#df.loc[:,['거래처','주문량']].plot.hist(bins=50,color=['red','blue'])
#plt.show()
Out[62]:
<AxesSubplot:>
In [42]:
#1총합
df.sum()
Out[42]:
거래처 A매장B매장C매장A매장C매장C매장C매장C매장
주문량 596
할인율 1.25
dtype: object
In [24]:
#2.평균
df.mean()
Out[24]:
주문량 74.50000
할인율 0.15625
dtype: float64
In [63]:
#1
df.sum()
#2
df.mean()
#3
df.describe()
#4
df[['주문량','할인율']].cumsum()
#5
df['주문량'].mul(df['할인율'])
#6
df['주문량'].cumsum()
Out[63]:
0 100
1 125
2 165
3 220
4 357
5 427
6 507
7 596
Name: 주문량, dtype: int64
In [27]:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
df = pd.read_excel('data/2016-01.xls', index_col='상품명')
df
Out[27]:
판매건수 | 가격 | 매출 | |
---|---|---|---|
상품명 | |||
봉투 | 12362 | 50 | 618100 |
바나나 | 4285 | 3900 | 16711500 |
야채 | 4190 | 0 | 0 |
켐벨포도 | 2780 | 29800 | 82844000 |
알뜰특란 | 2768 | 5300 | 14670400 |
... | ... | ... | ... |
바지락 | 253 | 0 | 0 |
해표)카놀라유 | 253 | 5600 | 1416800 |
오)자른당면 | 252 | 5850 | 1474200 |
롯데)알뜰소시지 | 252 | 4400 | 1108800 |
한돈앞다리/불고기,찌개(국내산) | 252 | 0 | 0 |
200 rows × 3 columns
판다스 데이타프레임의 기본적인 정보 얻어오기¶
- 앞에 10개 행 보기
- 뒤에 10개 행 보기
- 판매건수에서 큰 값 순으로 10개 (nlargest()이용)
- 판매건수에서 작은 값 순으로 10개 (nsmallest()이용)
In [24]:
print(df.head(10))
print(df.tail(10))
print(df['판매건수'].nlargest(10))
print(df['판매건수'].nsmallest(10))
판매건수 가격 매출
상품명
봉투 12362 50 618100
바나나 4285 3900 16711500
야채 4190 0 0
켐벨포도 2780 29800 82844000
알뜰특란 2768 5300 14670400
딸기 2234 0 0
팔음산포도 2161 19800 42787800
봉투 2038 30 61140
애호박 1962 1490 2923380
청양고추 1901 0 0
판매건수 가격 매출
상품명
황도복숭아 258 0 0
CJ)주부초밥왕(소풍) 256 3750 960000
온동네광천파래재래김(전장) 255 2550 650250
새송이버섯 255 0 0
CJ)행콩나물 253 1950 493350
바지락 253 0 0
해표)카놀라유 253 5600 1416800
오)자른당면 252 5850 1474200
롯데)알뜰소시지 252 4400 1108800
한돈앞다리/불고기,찌개(국내산) 252 0 0
상품명
봉투 12362
바나나 4285
야채 4190
켐벨포도 2780
알뜰특란 2768
딸기 2234
팔음산포도 2161
봉투 2038
애호박 1962
청양고추 1901
Name: 판매건수, dtype: int64
상품명
오)자른당면 252
롯데)알뜰소시지 252
한돈앞다리/불고기,찌개(국내산) 252
CJ)행콩나물 253
바지락 253
해표)카놀라유 253
온동네광천파래재래김(전장) 255
새송이버섯 255
CJ)주부초밥왕(소풍) 256
황도복숭아 258
Name: 판매건수, dtype: int64
In [25]:
df.columns
print(type(df['판매건수']))
print(type(df[['판매건수']])) ## 안의 꺽새는 리스트를 뜻함
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
행에서 데이타 추출¶
- 야채, 딸기, 봉투행을 추출하여 매출순으로 정렬하기 (sort_values()이용)
- 바나나행부터 딸기행까지 추출
- 야채부터 딸기행까지 추출
In [89]:
df.loc[['야채','딸기','봉투']].sort_values('매출', ascending=False)
#df['바나나':'딸기'] 에러발생
df.loc['야채':'딸기','가격'] # 야채부터 딸기행, 그리고 가격컬럼표시 !
Out[89]:
상품명
야채 0
켐벨포도 29800
알뜰특란 5300
딸기 0
Name: 가격, dtype: int64
일련번호로 데이타 추출¶
- 1번째 행 레코드 출력
- '바나나' 행 레코드 출력
In [51]:
df.iloc[1]
df.loc['바나나']
Out[51]:
판매건수 | 가격 | 매출 | |
---|---|---|---|
상품명 | |||
바나나 | 4285 | 3900 | 16711500 |
바나나 | 1213 | 0 | 0 |
조건으로 검색¶
- 가격이 10000 초과 상품 출력
- 가격이 10000에서 20000 사이 상품 출력
In [75]:
#가격이 10000초과 상품 출력
df[df['가격'] > 10000]
Out[75]:
판매건수 | 가격 | 매출 | |
---|---|---|---|
상품명 | |||
켐벨포도 | 2780 | 29800 | 82844000 |
팔음산포도 | 2161 | 19800 | 42787800 |
동서)맥심모카골드믹스 | 380 | 23800 | 9044000 |
감귤 | 297 | 29800 | 8850600 |
In [76]:
#가격이 10000에서 20000사이 상품 출력
df[(df['가격'] >= 10000) & (df['가격'] <= 20000)]
Out[76]:
판매건수 | 가격 | 매출 | |
---|---|---|---|
상품명 | |||
팔음산포도 | 2161 | 19800 | 42787800 |
In [92]:
price=df['가격']
print(price)
for i in price:
if i > 10000:
print(i)
상품명
봉투 50
바나나 3900
야채 0
켐벨포도 29800
알뜰특란 5300
...
바지락 0
해표)카놀라유 5600
오)자른당면 5850
롯데)알뜰소시지 4400
한돈앞다리/불고기,찌개(국내산) 0
Name: 가격, Length: 200, dtype: int64
29800
19800
23800
29800
판매건수로 정렬¶
In [104]:
df.sort_values(['판매건수','가격'], ascending=[False, True])
Out[104]:
판매건수 | 가격 | 매출 | |
---|---|---|---|
상품명 | |||
봉투 | 12362 | 50 | 618100 |
바나나 | 4285 | 3900 | 16711500 |
야채 | 4190 | 0 | 0 |
켐벨포도 | 2780 | 29800 | 82844000 |
알뜰특란 | 2768 | 5300 | 14670400 |
... | ... | ... | ... |
CJ)행콩나물 | 253 | 1950 | 493350 |
해표)카놀라유 | 253 | 5600 | 1416800 |
한돈앞다리/불고기,찌개(국내산) | 252 | 0 | 0 |
롯데)알뜰소시지 | 252 | 4400 | 1108800 |
오)자른당면 | 252 | 5850 | 1474200 |
200 rows × 3 columns
In [ ]:
# 가격순으로 정렬하되 판매건수와 가격만 추출
연속적(chain)으로 데이타 추출¶
가격순으로 정렬하되 판매건수와 가격만 추출
In [86]:
df[['판매건수','가격']].sort_values('가격', ascending=False)
Out[86]:
판매건수 | 가격 | |
---|---|---|
상품명 | ||
켐벨포도 | 2780 | 29800 |
감귤 | 297 | 29800 |
동서)맥심모카골드믹스 | 380 | 23800 |
팔음산포도 | 2161 | 19800 |
부사 | 844 | 9800 |
... | ... | ... |
특수야채류 | 520 | 0 |
켐벨포도 | 552 | 0 |
숙주 | 584 | 0 |
봄동 | 636 | 0 |
한돈앞다리/불고기,찌개(국내산) | 252 | 0 |
200 rows × 2 columns
In [2]:
import pandas as pd
df = pd.DataFrame( {'a':[10,20,30], 'b':[2, 4, 6]})
df
Out[2]:
a | b | |
---|---|---|
0 | 10 | 2 |
1 | 20 | 4 |
2 | 30 | 6 |
In [7]:
# 1. 함수 정의
def my_fun1(x):
return x**2
def my_fun2(x, n):
return x**n
my_fun1(df)
my_fun2(df, 3)
my_fun1(df['a'])
my_fun2(df['b'],3)
Out[7]:
0 8
1 64
2 216
Name: b, dtype: int64
In [8]:
# 2. apply 함수를 이용하여 모든 데이타에 각각 함수 적용하기
'''
개념적으로 본다면
for i in df['a']:
my_fun1(i)
'''
df.apply(my_fun1)
Out[8]:
a | b | |
---|---|---|
0 | 100 | 4 |
1 | 400 | 16 |
2 | 900 | 36 |
In [10]:
# [연습] 데이타 프레임의 각 열 단위로 데이타의 합을 출력
def my_fun3(col):
sum=0
for i in col:
sum += i
return sum
df.apply(my_fun3) #열단위
df.apply(my_fun3, axis=1) # 행단위
Out[10]:
0 12
1 24
2 36
dtype: int64
In [18]:
# 'a' 컬럼의 값이 10 이하는 'C', 20 이하는 'B', 30 이하는 'A'를 지정하고자 할 때
def func(score):
grade = ''
if( score <= 10) : grade='C'
elif(score <= 20) : grade='B'
elif(score <= 30) : grade='A'
return grade
# 'result' 컬럼을 추가 - 위에서 구한 A,B,C 값
df
df['result'] = df['a'].apply(func) #기존의 DATAFRAME에 result 컬럼을 추가
df
Out[18]:
a | b | result | |
---|---|---|---|
0 | 10 | 2 | C |
1 | 20 | 4 | B |
2 | 30 | 6 | A |
[연습] 고객의 결제정보에서 vip 선별¶
결재가 confirmed 된 상태이고 금액이 500원이상 구매한 고객들을 vip로 선별하고 그 외 고객들은 non-vip로 지정하여 grade 컬럼에 추가 저장한다.
In [34]:
import pandas as pd
# index_col : 지정한 컬럼을 Row Index로 사용한다.
customer = pd.read_csv('./data/customer.csv', index_col = "Name")
def is_vip(arg):
if arg['price'] >= 500 and arg['state']=='confirmed':
grade='vip'
else:
grade='non-vip'
return grade
customer['grade'] = customer[['price','state']].apply(is_vip,axis=1)
customer
Out[34]:
date | price | state | grade | |
---|---|---|---|---|
Name | ||||
Kang | 2017-01-01 | 500 | confirmed | vip |
Kim | 2017-01-03 | 700 | confirmed | vip |
Choi | 2017-01-03 | 900 | confirmed | vip |
Park | 2017-01-05 | 800 | confirmed | vip |
Lee | 2017-01-07 | 500 | canceled | non-vip |
Yoon | 2017-01-09 | 700 | confirmed | vip |
Jang | 2017-01-09 | 600 | canceled | non-vip |
Ko | 2017-01-10 | 200 | canceled | non-vip |
In [ ]:
결측치 데이타 처리¶
- 결측치는 데이터 분석 결과에 엄청난 영향을 미치기에 존재여부 확인부터 중요
- None를 포함하며, 결측값은 ‘NaN’로 표시
- 결측값 확인 메소드
- isnull()
- notnull()
- 결측값 처리
(1) 제거 : dropna()
(2) 대치 : fillna()
In [4]:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.ones((4,4)),index=['A','B','C','D'])
df
Out[4]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | 1.0 | 1.0 | 1.0 | 1.0 |
B | 1.0 | 1.0 | 1.0 | 1.0 |
C | 1.0 | 1.0 | 1.0 | 1.0 |
D | 1.0 | 1.0 | 1.0 | 1.0 |
In [10]:
# 결측치 만들기 ( NaN, nan)
# df.iloc[1][1] = np.NaN #1행의 1열에 결측치 생성
# df
# df.iloc[1:,2]= np.NaN #앞이 행 뒤에가 열
df.loc['B'][1] = np.NaN
df
Out[10]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | 1.0 | 1.0 | 1.0 | 1.0 |
B | 1.0 | NaN | NaN | 1.0 |
C | 1.0 | 1.0 | NaN | 1.0 |
D | 1.0 | 1.0 | NaN | 1.0 |
In [11]:
df.loc['B':,2] = np.NaN
df
Out[11]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | 1.0 | 1.0 | 1.0 | 1.0 |
B | 1.0 | NaN | NaN | 1.0 |
C | 1.0 | 1.0 | NaN | 1.0 |
D | 1.0 | 1.0 | NaN | 1.0 |
In [12]:
# 누적합을 구할 때
df.cumsum() # 결측치 뺴고 출력
Out[12]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | 1.0 | 1.0 | 1.0 | 1.0 |
B | 2.0 | NaN | NaN | 2.0 |
C | 3.0 | 2.0 | NaN | 3.0 |
D | 4.0 | 3.0 | NaN | 4.0 |
In [13]:
# 결측치 확인
# 결측치 -> True / 결측치 아닌 값 -> False
df.isnull()
Out[13]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | False | False | False | False |
B | False | True | True | False |
C | False | False | True | False |
D | False | False | True | False |
In [14]:
#결측치가 아닌걸 확인
#isnull과 출력 반대
df.notnull()
Out[14]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | True | True | True | True |
B | True | False | False | True |
C | True | True | False | True |
D | True | True | False | True |
In [17]:
# 결측치 갯수는 ?
# 결측치는 count()가 아니라 sum()을 해야 true =1 flase = 0 으로 계산한다
df.isnull().sum()
Out[17]:
0 0
1 1
2 3
3 0
dtype: int64
결측치 처리¶
In [18]:
df.dropna()
Out[18]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | 1.0 | 1.0 | 1.0 | 1.0 |
In [22]:
df.fillna(0)
Out[22]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | 1.0 | 1.0 | 1.0 | 1.0 |
B | 1.0 | 0.0 | 0.0 | 1.0 |
C | 1.0 | 1.0 | 0.0 | 1.0 |
D | 1.0 | 1.0 | 0.0 | 1.0 |
In [23]:
df.fillna('none')
Out[23]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | 1.0 | 1.0 | 1.0 | 1.0 |
B | 1.0 | none | none | 1.0 |
C | 1.0 | 1.0 | none | 1.0 |
D | 1.0 | 1.0 | none | 1.0 |
In [25]:
df.fillna({1 : 'Null', 2: -100})
Out[25]:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
A | 1.0 | 1.0 | 1.0 | 1.0 |
B | 1.0 | Null | -100.0 | 1.0 |
C | 1.0 | 1.0 | -100.0 | 1.0 |
D | 1.0 | 1.0 | -100.0 | 1.0 |
In [ ]:
UCI 저장소에서 제공하는 피마인디언 데이타¶
- 1950년대까지 비만인이 없던 피마인디언 부족
- 그러나 페스트푸드 문화와 더불어 지금은 전체 부족의 60%가 당뇨이고 80%가 비만이다
- 샘플수(레코드) : 768
- 속성 : 8
- 정보1 (pregnant) : 과거 임신 횟수 - 정보2 (plasma) : 포도당 부하 검사 2시간 후 공복 혈당 농도 (mm Hg) - 정보3 (pressure) : 혈압(mm Hg) - 정보4 (thickness) :삼두근 피부 주름 두께(mm) - 정보5 (insulin) : 혈청 인슐린 (2hour, mu U/ml) - 정보6 (BMI) : 체질량지수 weight(kg)/(height(m)*height(m)) - 정보7 (pedigree) : 당뇨병 가족력 - 정보8 (age) : 나이
- 클래스 : 당뇨 (1:당뇨 / 0:당뇨아님)
In [3]:
# (1) 데이타셋 로딩
# pima-indians-diabetes.csv 파일을 데이타프레임으로 로딩하면서 컬럼명도 지정
import pandas as pd
# df = pd.read_csv('./data/pima-indians-diabetes.csv')
# df
df = pd.read_csv('./data/pima-indians-diabetes.csv', names=['pregnant','plasma','pressure','thickness',
'insulin','BMI','pedigree','age','diabetes'])
df
Out[3]:
pregnant | plasma | pressure | thickness | insulin | BMI | pedigree | age | diabetes | |
---|---|---|---|---|---|---|---|---|---|
0 | 6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 | 1 |
1 | 1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 | 0 |
2 | 8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 | 1 |
3 | 1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 | 0 |
4 | 0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 | 1 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
763 | 10 | 101 | 76 | 48 | 180 | 32.9 | 0.171 | 63 | 0 |
764 | 2 | 122 | 70 | 27 | 0 | 36.8 | 0.340 | 27 | 0 |
765 | 5 | 121 | 72 | 23 | 112 | 26.2 | 0.245 | 30 | 0 |
766 | 1 | 126 | 60 | 0 | 0 | 30.1 | 0.349 | 47 | 1 |
767 | 1 | 93 | 70 | 31 | 0 | 30.4 | 0.315 | 23 | 0 |
768 rows × 9 columns
In [12]:
# (2) 정보 확인
df.shape
df.info()
df.describe()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 pregnant 768 non-null int64
1 plasma 768 non-null int64
2 pressure 768 non-null int64
3 thickness 768 non-null int64
4 insulin 768 non-null int64
5 BMI 768 non-null float64
6 pedigree 768 non-null float64
7 age 768 non-null int64
8 diabetes 768 non-null int64
dtypes: float64(2), int64(7)
memory usage: 54.1 KB
Out[12]:
pregnant | plasma | pressure | thickness | insulin | BMI | pedigree | age | diabetes | |
---|---|---|---|---|---|---|---|---|---|
count | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 |
mean | 3.845052 | 120.894531 | 69.105469 | 20.536458 | 79.799479 | 31.992578 | 0.471876 | 33.240885 | 0.348958 |
std | 3.369578 | 31.972618 | 19.355807 | 15.952218 | 115.244002 | 7.884160 | 0.331329 | 11.760232 | 0.476951 |
min | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.078000 | 21.000000 | 0.000000 |
25% | 1.000000 | 99.000000 | 62.000000 | 0.000000 | 0.000000 | 27.300000 | 0.243750 | 24.000000 | 0.000000 |
50% | 3.000000 | 117.000000 | 72.000000 | 23.000000 | 30.500000 | 32.000000 | 0.372500 | 29.000000 | 0.000000 |
75% | 6.000000 | 140.250000 | 80.000000 | 32.000000 | 127.250000 | 36.600000 | 0.626250 | 41.000000 | 1.000000 |
max | 17.000000 | 199.000000 | 122.000000 | 99.000000 | 846.000000 | 67.100000 | 2.420000 | 81.000000 | 1.000000 |
[연습] 임신횟수(pregnant)당 당뇨병 발생(diabetes) 확률을 구한다¶
In [14]:
temp = df[['pregnant','diabetes']]
temp
Out[14]:
pregnant | diabetes | |
---|---|---|
0 | 6 | 1 |
1 | 1 | 0 |
2 | 8 | 1 |
3 | 1 | 0 |
4 | 0 | 1 |
... | ... | ... |
763 | 10 | 0 |
764 | 2 | 0 |
765 | 5 | 0 |
766 | 1 | 1 |
767 | 1 | 0 |
768 rows × 2 columns
In [27]:
temp2= temp.groupby(['pregnant']).count()
temp2
Out[27]:
diabetes | |
---|---|
pregnant | |
0 | 111 |
1 | 135 |
2 | 103 |
3 | 75 |
4 | 68 |
5 | 57 |
6 | 50 |
7 | 45 |
8 | 38 |
9 | 28 |
10 | 24 |
11 | 11 |
12 | 9 |
13 | 10 |
14 | 2 |
15 | 1 |
17 | 1 |
In [17]:
temp2= temp.groupby(['pregnant']).mean()
temp2
Out[17]:
diabetes | |
---|---|
pregnant | |
0 | 0.342342 |
1 | 0.214815 |
2 | 0.184466 |
3 | 0.360000 |
4 | 0.338235 |
5 | 0.368421 |
6 | 0.320000 |
7 | 0.555556 |
8 | 0.578947 |
9 | 0.642857 |
10 | 0.416667 |
11 | 0.636364 |
12 | 0.444444 |
13 | 0.500000 |
14 | 1.000000 |
15 | 1.000000 |
17 | 1.000000 |
In [24]:
temp2.plot();
[ 분석 ] 임신횟수가 14번 이상이면 당뇨병에 걸릴 확률이 100%인가?
임신횟수가 14번 이상인 경우가 몇 건 없는데 당뇨병이라고 하여 이를 확정할 수 있나???`0
적어도 집단의 비율이 동일해야 예를 들어
1 ~ 3명 / 4 ~ 6명 / 7 ~ 9명 / 10 ~ 12명 / 13 ~ 이상명을 임신횟수를 가진 사람들을 각 집단에 100명씩 조사한 결과라던가
[ 추가 고민 ] 임신횟수별 인원수를 구해서 나누면 되지 않을까나
In [ ]:
In [ ]:
타이타닉 데이타 셋¶
- Survival - 생존 여부. 0이면 사망, 1이면 생존한 것으로 간주합니다.
- Pclass - 티켓 등급. 1등석(1), 2등석(2), 3등석(3)이 있으며, 1등석일수록 좋고 3등석일수록 좋지 않습니다.
- Sex - 성별. 남자(male)와 여자(female)이 있습니다.
- Age - 나이입니다. 틈틈히 빈 값이 존재하며, 소수점 값도 존재합니다.
- SibSp - 해당 승객과 같이 탑승한 형재/자매(siblings)와 배우자(spouses)의 총 인원 수입니다.
- Parch - 해당 승객과 같이 탑승한 부모(parents)와 자식(children)의 총 인원 수입니다.
- Ticket - 티켓 번호입니다. 다양한 텍스트(문자열)로 구성되어 있습니다.
- Fare - 운임 요금입니다. 소수점으로 구성되어 있습니다.
- Cabin - 객실 번호입니다. 많은 빈 값이 존재하며, 다양한 텍스트(문자열)로 구성되어 있습니다.
- Embarked - 선착장입니다. C는 셰르부르(Cherbourg)라는 프랑스 지역, Q는 퀸스타운(Queenstown)이라는 영국 지역, S는 사우스햄튼(Southampton)이라는 영국 지역입니다.
In [11]:
import pandas as pd
titanic = pd.read_csv('data/titanic.csv')
titanic
Out[11]:
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | 30.0 | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
889 | 890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
890 | 891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
891 rows × 12 columns
In [7]:
# (1) 1등실 승객중 나이가 10세 미만인 승객
data1 = titanic[(titanic['Pclass']==1) & (titanic['Age']<10)]
data1
Out[7]:
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
297 | 298 | 0 | 1 | Allison, Miss. Helen Loraine | female | 2.00 | 1 | 2 | 113781 | 151.5500 | C22 C26 | S |
305 | 306 | 1 | 1 | Allison, Master. Hudson Trevor | male | 0.92 | 1 | 2 | 113781 | 151.5500 | C22 C26 | S |
445 | 446 | 1 | 1 | Dodge, Master. Washington | male | 4.00 | 0 | 2 | 33638 | 81.8583 | A34 | S |
In [12]:
# (2) 선실 등급별 승객의 수
titanic[['Pclass','PassengerId']].groupby('Pclass').count()
Out[12]:
PassengerId | |
---|---|
Pclass | |
1 | 216 |
2 | 184 |
3 | 491 |
In [21]:
# (3) 선실 등급별 생존자 수
titanic[['Pclass','Survived','PassengerId']].groupby(['Pclass','Survived']).count()
Out[21]:
PassengerId | ||
---|---|---|
Pclass | Survived | |
1 | 0 | 80 |
1 | 136 | |
2 | 0 | 97 |
1 | 87 | |
3 | 0 | 372 |
1 | 119 |
In [22]:
"""
groupby().agg()
DataFrame의 groupby()는 SQL의 group by 보다 유연성이 떨어질 수 밖에 없다
그래도 DataFrame의 groupby()에서 여러 개의 컬럼에 각각 다른 집계 함수를 사용할 때 agg() 함수 이용
"""
# 선실등급별 가장 많은 나이값, 평균요금 구하고자 한다면??
titanic.groupby('Pclass').agg({'Age':'max', 'Fare':'mean'})
Out[22]:
Age | Fare | |
---|---|---|
Pclass | ||
1 | 80.0 | 84.154687 |
2 | 70.0 | 20.662183 |
3 | 74.0 | 13.675550 |
In [33]:
# 나이에 따라 15미만은 Chlid, 15이상 60세 미만은 'Adult' 그 이상은 Elderly로 구분하려면
def get_age_cate(age):
cat = ''
if age < 15: cat = 'Child'
elif age < 60 : cat = 'Adult'
else : cat = 'Elderly'
return cat
titanic['Age_cast'] = titanic['Age'].apply(get_age_cate)
titanic.head(30)
Out[33]:
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | Age_cast | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S | Adult |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C | Adult |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S | Adult |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S | Adult |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S | Adult |
5 | 6 | 0 | 3 | Moran, Mr. James | male | 30.0 | 0 | 0 | 330877 | 8.4583 | NaN | Q | Adult |
6 | 7 | 0 | 1 | McCarthy, Mr. Timothy J | male | 54.0 | 0 | 0 | 17463 | 51.8625 | E46 | S | Adult |
7 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard | male | 2.0 | 3 | 1 | 349909 | 21.0750 | NaN | S | Child |
8 | 9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) | female | 27.0 | 0 | 2 | 347742 | 11.1333 | NaN | S | Adult |
9 | 10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) | female | 14.0 | 1 | 0 | 237736 | 30.0708 | NaN | C | Child |
10 | 11 | 1 | 3 | Sandstrom, Miss. Marguerite Rut | female | 4.0 | 1 | 1 | PP 9549 | 16.7000 | G6 | S | Child |
11 | 12 | 1 | 1 | Bonnell, Miss. Elizabeth | female | 58.0 | 0 | 0 | 113783 | 26.5500 | C103 | S | Adult |
12 | 13 | 0 | 3 | Saundercock, Mr. William Henry | male | 20.0 | 0 | 0 | A/5. 2151 | 8.0500 | NaN | S | Adult |
13 | 14 | 0 | 3 | Andersson, Mr. Anders Johan | male | 39.0 | 1 | 5 | 347082 | 31.2750 | NaN | S | Adult |
14 | 15 | 0 | 3 | Vestrom, Miss. Hulda Amanda Adolfina | female | 14.0 | 0 | 0 | 350406 | 7.8542 | NaN | S | Child |
15 | 16 | 1 | 2 | Hewlett, Mrs. (Mary D Kingcome) | female | 55.0 | 0 | 0 | 248706 | 16.0000 | NaN | S | Adult |
16 | 17 | 0 | 3 | Rice, Master. Eugene | male | 2.0 | 4 | 1 | 382652 | 29.1250 | NaN | Q | Child |
17 | 18 | 1 | 2 | Williams, Mr. Charles Eugene | male | 30.0 | 0 | 0 | 244373 | 13.0000 | NaN | S | Adult |
18 | 19 | 0 | 3 | Vander Planke, Mrs. Julius (Emelia Maria Vande... | female | 31.0 | 1 | 0 | 345763 | 18.0000 | NaN | S | Adult |
19 | 20 | 1 | 3 | Masselmani, Mrs. Fatima | female | 30.0 | 0 | 0 | 2649 | 7.2250 | NaN | C | Adult |
20 | 21 | 0 | 2 | Fynney, Mr. Joseph J | male | 35.0 | 0 | 0 | 239865 | 26.0000 | NaN | S | Adult |
21 | 22 | 1 | 2 | Beesley, Mr. Lawrence | male | 34.0 | 0 | 0 | 248698 | 13.0000 | D56 | S | Adult |
22 | 23 | 1 | 3 | McGowan, Miss. Anna "Annie" | female | 15.0 | 0 | 0 | 330923 | 8.0292 | NaN | Q | Adult |
23 | 24 | 1 | 1 | Sloper, Mr. William Thompson | male | 28.0 | 0 | 0 | 113788 | 35.5000 | A6 | S | Adult |
24 | 25 | 0 | 3 | Palsson, Miss. Torborg Danira | female | 8.0 | 3 | 1 | 349909 | 21.0750 | NaN | S | Child |
25 | 26 | 1 | 3 | Asplund, Mrs. Carl Oscar (Selma Augusta Emilia... | female | 38.0 | 1 | 5 | 347077 | 31.3875 | NaN | S | Adult |
26 | 27 | 0 | 3 | Emir, Mr. Farred Chehab | male | 30.0 | 0 | 0 | 2631 | 7.2250 | NaN | C | Adult |
27 | 28 | 0 | 1 | Fortune, Mr. Charles Alexander | male | 19.0 | 3 | 2 | 19950 | 263.0000 | C23 C25 C27 | S | Adult |
28 | 29 | 1 | 3 | O'Dwyer, Miss. Ellen "Nellie" | female | 30.0 | 0 | 0 | 330959 | 7.8792 | NaN | Q | Adult |
29 | 30 | 0 | 3 | Todoroff, Mr. Lalio | male | 30.0 | 0 | 0 | 349216 | 7.8958 | NaN | S | Adult |
In [38]:
#선실 등급별 나이등급에 따른 생존자수 확인
titanic[['Pclass','Age_cast','Survived']].groupby(['Pclass','Age_cast']).sum()
Out[38]:
Survived | ||
---|---|---|
Pclass | Age_cast | |
1 | Adult | 127 |
Child | 4 | |
Elderly | 5 | |
2 | Adult | 67 |
Child | 19 | |
Elderly | 1 | |
3 | Adult | 96 |
Child | 22 | |
Elderly | 1 |
In [2]:
import pandas as pd
df = pd.read_excel('data/고속버스.xlsx')
df
Out[2]:
차종 | 선별 | 출발지 | 도착지 | 거리 | 총운행횟수 | 총이용인원 | 이용율 | |
---|---|---|---|---|---|---|---|---|
0 | 우등 | 88선 | 광주 | 울산 | 327.8 | 412 | 7283 | 63.1 |
1 | 고속 | 88선 | 광주 | 울산 | 327.8 | 145 | 3050 | 46.7 |
2 | 우등 | 88선 | 광주 | 울산신복 | 327.8 | 164 | 545 | 11.9 |
3 | 고속 | 88선 | 광주 | 울산신복 | 327.8 | 70 | 311 | 9.9 |
4 | 우등 | 88선 | 광주 | 동대구 | 219.3 | 1369 | 21873 | 57.1 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
346 | 고속 | 호남선 | 청주 | 광주 | 207.5 | 268 | 4858 | 40.3 |
347 | 고속 | 호남선 | 청주시외 | 여수 | 290.1 | 21 | 513 | 54.3 |
348 | 우등 | 호남선 | 광주 | 전주 | 105.9 | 1802 | 34137 | 67.7 |
349 | 고속 | 호남선 | 광주 | 전주 | 105.9 | 1043 | 30394 | 64.8 |
350 | 우등 | 호남선 | 여수 | 군산 | 195.9 | 114 | 711 | 22.3 |
351 rows × 8 columns
In [17]:
# 그룹화 - '선별' 단위로 각각의 노선에 대한 총 갯수
df.groupby('선별').count()
Out[17]:
차종 | 출발지 | 도착지 | 거리 | 총운행횟수 | 총이용인원 | 이용율 | |
---|---|---|---|---|---|---|---|
선별 | |||||||
88선 | 18 | 18 | 18 | 18 | 18 | 18 | 18 |
경부선 | 105 | 105 | 105 | 105 | 105 | 105 | 105 |
경인선 | 25 | 25 | 25 | 25 | 25 | 25 | 25 |
구마선 | 30 | 30 | 30 | 30 | 30 | 30 | 30 |
남해선 | 21 | 21 | 21 | 21 | 21 | 21 | 21 |
동해선 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
영동선 | 26 | 26 | 26 | 26 | 26 | 26 | 26 |
호남선 | 122 | 122 | 122 | 122 | 122 | 122 | 122 |
In [7]:
%matplotlib inline
# 한글처리
from matplotlib import rc
rc('font', family='Malgun Gothic')
In [47]:
# 노선별 수에 대한 그래프
data2=df.groupby('선별').count()
data2.차종.plot(kind='barh')
Out[47]:
<AxesSubplot:ylabel='선별'>
In [48]:
# 차종별, 노선별별 그룹화 작업
data3 = df.groupby([df['차종'],df['선별']])['총운행횟수'].count()
data3.plot(kind='barh')
Out[48]:
<AxesSubplot:ylabel='차종,선별'>
In [9]:
# 교차테이블(cross tab) - 엑셀의 Pivot 유사
result = pd.crosstab(df['차종'],df['선별'])
result
result.plot(kind='bar')
Out[9]:
<AxesSubplot:xlabel='차종'>
In [18]:
result
Out[18]:
선별 | 88선 | 경부선 | 경인선 | 구마선 | 남해선 | 동해선 | 영동선 | 호남선 |
---|---|---|---|---|---|---|---|---|
차종 | ||||||||
고속 | 7 | 57 | 11 | 14 | 13 | 2 | 14 | 63 |
우등 | 11 | 48 | 14 | 16 | 8 | 2 | 12 | 59 |
In [21]:
result.loc['고속'].plot(kind='pie')
Out[21]:
<AxesSubplot:ylabel='고속'>
In [22]:
result.loc['우등'].plot(kind='pie')
Out[22]:
<AxesSubplot:ylabel='우등'>
In [2]:
import pandas as pd
# csv 파일로 저장하기
mysource = {
'시도':['서울','경기','인천','부산','대전'],
'구분':['특별시','도','광역시','광역시','광역시'],
'인구':['999만','1300만','400만','600만','300만'],
'면적':[600.9, 10171, 1234.5, 747.8, 459.1]
}
df=pd.DataFrame(mysource)
df
Out[2]:
시도 | 구분 | 인구 | 면적 | |
---|---|---|---|---|
0 | 서울 | 특별시 | 999만 | 600.9 |
1 | 경기 | 도 | 1300만 | 10171.0 |
2 | 인천 | 광역시 | 400만 | 1234.5 |
3 | 부산 | 광역시 | 600만 | 747.8 |
4 | 대전 | 광역시 | 300만 | 459.1 |
In [ ]:
df.to_csv('./result/temp.csv')
df.to_excel('result/temp.xlsx')
In [8]:
# csv 파일을 읽어오는 방법
df2 = pd.read_csv('./result/temp.csv',index_col=['Unnamed: 0'])
df2
Out[8]:
시도 | 구분 | 인구 | 면적 | |
---|---|---|---|---|
0 | 서울 | 특별시 | 999만 | 600.9 |
1 | 경기 | 도 | 1300만 | 10171.0 |
2 | 인천 | 광역시 | 400만 | 1234.5 |
3 | 부산 | 광역시 | 600만 | 747.8 |
4 | 대전 | 광역시 | 300만 | 459.1 |
In [4]:
# 컬럼명을 인덱스로 지정
df2 = pd.read_csv('./result/temp.csv',index_col=['Unnamed: 0'])
df2
In [9]:
# 불필요한 행 제외하고 로딩하기
df3 = pd.read_csv('./result/temp.csv',index_col=['Unnamed: 0'], nrows=3)
df3
Out[9]:
시도 | 구분 | 인구 | 면적 | |
---|---|---|---|---|
0 | 서울 | 특별시 | 999만 | 600.9 |
1 | 경기 | 도 | 1300만 | 10171.0 |
2 | 인천 | 광역시 | 400만 | 1234.5 |
In [19]:
# 엑셀 파일 로딩하기
df4 = pd.read_excel('data/인구주택총조사2015.xlsx', nrows=10,usecols='C:J')
df4
Out[19]:
남자 | 여자 | 내국인계 | 내국인_남자 | 내국인_여자 | 외국인계 | 외국인_남자 | 외국인_여자 | |
---|---|---|---|---|---|---|---|---|
0 | 25608502 | 25460873 | 49705663 | 24819839 | 24885824 | 1363712 | 788663 | 575049 |
1 | 2360708 | 2256094 | 4467697 | 2262853 | 2204844 | 149105 | 97855 | 51250 |
2 | 2455898 | 2318980 | 4546520 | 2291860 | 2254660 | 228358 | 164038 | 64320 |
3 | 20791896 | 20885799 | 40691446 | 20265126 | 20426320 | 986249 | 526770 | 459479 |
4 | 4859535 | 5044777 | 9567196 | 4694317 | 4872879 | 337116 | 165218 | 171898 |
5 | 1701347 | 1747390 | 3404667 | 1675339 | 1729328 | 44070 | 26008 | 18062 |
6 | 1228511 | 1237541 | 2436770 | 1211219 | 1225551 | 29282 | 17292 | 11990 |
7 | 1455017 | 1435434 | 2822601 | 1414793 | 1407808 | 67850 | 40224 | 27626 |
8 | 748867 | 754014 | 1481289 | 736656 | 744633 | 21592 | 12211 | 9381 |
9 | 772243 | 766151 | 1519314 | 763310 | 756004 | 19080 | 8933 | 10147 |
In [8]:
# 컬럼 지정 (컬럼의 종류가 너무 많은데 필요한 부분이 작은 경우에 사용한다)
텍스트파일 읽어오기¶
In [28]:
# 텍스트파일(data/TextData.txt) 읽어오기
# 미리 엑셀파일에서 5줄 복사해서 메모장에 넣고 (탭구분상태)로 저장한다.
df5 = pd.read_csv('data/TextData.txt',encoding='cp949',sep='\t')
df5
Out[28]:
행정구역별 | 총인구 | 남자 | 여자 | 내국인계 | 내국인_남자 | |
---|---|---|---|---|---|---|
0 | 전국 | 51069375 | 25608502 | 25460873 | 49705663 | 24819839 |
1 | 읍부 | 4616802 | 2360708 | 2256094 | 4467697 | 2262853 |
2 | 면부 | 4774878 | 2455898 | 2318980 | 4546520 | 2291860 |
3 | 동부 | 41677695 | 20791896 | 20885799 | 40691446 | 20265126 |
JSON 파일 읽어오기¶
In [30]:
# JSON 파일(data/JsonData.json) 읽어오기
df7=pd.read_json('data/JsonData.json', orient='index')
df7
Out[30]:
0 | |
---|---|
kind1 | koreanfood |
region | [nosong, bibim, jungsung] |
food_name | {'best-of-best': 'bibimbab', 'one-of-best': 'b... |
In [32]:
import json
data = json.load(open('data/JsonData.json'))
data
Out[32]:
{'kind1': 'koreanfood',
'region': ['nosong', 'bibim', 'jungsung'],
'food_name': {'best-of-best': 'bibimbab', 'one-of-best': 'bulgogi'}}
In [43]:
data2 = data['food_name']['best-of-best']
data2
Out[43]:
'bibimbab'
'Programing Language > Python' 카테고리의 다른 글
0831 머신러닝(machine learning) (0) | 2021.08.31 |
---|---|
0830 데이터 정제 (0) | 2021.08.30 |
0827 matplotlib 시각화 (0) | 2021.08.29 |
0825 Python , jupyterNoteBook (0) | 2021.08.25 |
python Day 3 (0) | 2021.08.05 |
댓글