1. 程式人生 > 其它 >7 Pandas-替換,對映,分組,透視表

7 Pandas-替換,對映,分組,透視表

import numpy as np
import pandas as pd
from pandas import DataFrame

替換操作

  • 替換操作可以同步作用於Series和DataFrame中

  • 單值替換

    • 普通替換: 替換所有符合要求的元素:to_replace=15,value='e'
    • 按列指定單值替換: to_replace={列標籤:替換值} value='value'
  • 多值替換

    • 列表替換: to_replace=[] value=[]
    • 字典替換(推薦) to_replace={to_replace:value,to_replace:value}
df = DataFrame(data=np.random.randint(0,100,size=(5,6)))
df
0 1 2 3 4 5
0 65 85 66 36 72 2
1 85 51 15 67 57 56
2 1 48 9 39 88 52
3 48 34 89 50 5 63
4 17 75 5 72 44 53
df.replace(to_replace=2,value='Two')
0 1 2 3 4 5
0 65 85 66 36 72 Two
1 85 51 15 67 57 56
2 1 48 9 39 88 52
3 48 34 89 50 5 63
4 17 75 5 72 44 53
df.replace(to_replace={1:'one'})
0 1 2 3 4 5
0 65 85 66 36 72 2
1 85 51 15 67 57 56
2 one 48 9 39 88 52
3 48 34 89 50 5 63
4 17 75 5 72 44 53
df.replace(to_replace={4:5},value='five')
#將指定列的元素進行替換to_replase={列索引:被替換的值}
0 1 2 3 4 5
0 65 85 66 36 72 2
1 85 51 15 67 57 56
2 1 48 9 39 88 52
3 48 34 89 50 five 63
4 17 75 5 72 44 53

對映操作

  • 概念:建立一個對映關係列表,把values元素和一個特定的標籤或者字串繫結(給一個元素值提供不同的表現形式)

  • 建立一個df,兩列分別是姓名和薪資,然後給其名字起對應的英文名

dic = {
    'name':['張三','李四','張三'],
    'salary':[15000,20000,15000]
}
df = DataFrame(data=dic)
df
name salary
0 張三 15000
1 李四 20000
2 張三 15000
#對映關係表
dic = {
    '張三':'tom',
    '李四':'jack'
}
df['e_name'] = df['name'].map(dic)
df
name salary e_name
0 張三 15000 tom
1 李四 20000 jack
2 張三 15000 tom
  • map是Series的方法,只能被Series呼叫

運算工具

  • 超過3000部分的錢繳納50%的稅,計算每個人的稅後薪資
#該函式是我們指定的一個運演算法則
def after_sal(s):#計算s對應的稅後薪資
    return s - (s-3000)*0.5
    
df['after_sal'] = df['salary'].map(after_sal)#可以將df['salary']這個Series中每一個元素(薪資)作為引數傳遞給s
df
name salary e_name after_sal
0 張三 15000 tom 9000.0
1 李四 20000 jack 11500.0
2 張三 15000 tom 9000.0

排序實現的隨機抽樣

  • take()
  • np.random.permutation()
df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B','C'])
df
A B C
0 6 97 40
1 9 42 1
2 7 40 82
3 82 89 50
4 6 93 93
5 21 30 33
6 1 70 65
7 33 51 73
8 70 40 19
9 27 98 84
10 30 33 45
11 41 19 34
12 32 0 23
13 70 60 22
14 52 99 10
15 60 79 6
16 35 16 1
17 71 63 99
18 86 43 89
19 4 43 78
20 72 64 54
21 4 17 27
22 64 60 84
23 77 73 89
24 59 90 19
25 4 22 71
26 86 89 38
27 56 60 92
28 75 37 15
29 31 0 43
... ... ... ...
70 23 1 7
71 12 88 5
72 52 52 35
73 26 48 96
74 26 49 63
75 23 34 68
76 82 36 46
77 74 49 70
78 17 53 50
79 18 34 2
80 41 61 18
81 84 92 98
82 10 20 61
83 64 33 42
84 14 87 16
85 67 47 75
86 95 26 77
87 13 94 85
88 12 27 86
89 53 97 76
90 26 98 71
91 49 95 15
92 62 33 77
93 51 63 44
94 80 68 2
95 6 32 67
96 76 8 64
97 83 44 14
98 59 17 61
99 66 46 99

100 rows × 3 columns

#生成亂序的隨機序列
np.random.permutation(10)
array([2, 1, 7, 3, 5, 0, 4, 9, 6, 8])
#將原始資料打亂
df.take([2,0,1],axis=1)
df.take(np.random.permutation(3),axis=1)
C A B
0 40 6 97
1 1 9 42
2 82 7 40
3 50 82 89
4 93 6 93
5 33 21 30
6 65 1 70
7 73 33 51
8 19 70 40
9 84 27 98
10 45 30 33
11 34 41 19
12 23 32 0
13 22 70 60
14 10 52 99
15 6 60 79
16 1 35 16
17 99 71 63
18 89 86 43
19 78 4 43
20 54 72 64
21 27 4 17
22 84 64 60
23 89 77 73
24 19 59 90
25 71 4 22
26 38 86 89
27 92 56 60
28 15 75 37
29 43 31 0
... ... ... ...
70 7 23 1
71 5 12 88
72 35 52 52
73 96 26 48
74 63 26 49
75 68 23 34
76 46 82 36
77 70 74 49
78 50 17 53
79 2 18 34
80 18 41 61
81 98 84 92
82 61 10 20
83 42 64 33
84 16 14 87
85 75 67 47
86 77 95 26
87 85 13 94
88 86 12 27
89 76 53 97
90 71 26 98
91 15 49 95
92 77 62 33
93 44 51 63
94 2 80 68
95 67 6 32
96 64 76 8
97 14 83 44
98 61 59 17
99 99 66 46

100 rows × 3 columns

df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)[0:50]
A B C
51 38 90 95
87 13 94 85
76 82 36 46
92 62 33 77
64 51 55 6
2 7 40 82
67 74 59 49
40 77 57 55
18 86 43 89
37 86 84 62
36 30 0 60
65 23 28 99
21 4 17 27
35 58 35 53
25 4 22 71
62 41 28 66
29 31 0 43
58 21 56 99
20 72 64 54
60 11 95 36
52 12 7 49
95 6 32 67
4 6 93 93
66 51 45 97
71 12 88 5
94 80 68 2
80 41 61 18
69 19 85 22
31 58 4 89
23 77 73 89
12 32 0 23
57 63 50 55
0 6 97 40
27 56 60 92
90 26 98 71
48 13 51 43
63 73 71 47
55 78 6 7
22 64 60 84
59 23 58 2
3 82 89 50
72 52 52 35
1 9 42 1
99 66 46 99
7 33 51 73
47 32 10 5
89 53 97 76
45 17 30 44
70 23 1 7
10 30 33 45

資料的分類處理

  • 資料分類處理的核心:

    • groupby()函式
    • groups屬性檢視分組情況
df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                'price':[4,3,3,2.5,4,2],
               'color':['red','yellow','yellow','green','green','green'],
               'weight':[12,20,50,30,20,44]})
df
item price color weight
0 Apple 4.0 red 12
1 Banana 3.0 yellow 20
2 Orange 3.0 yellow 50
3 Banana 2.5 green 30
4 Orange 4.0 green 20
5 Apple 2.0 green 44
#想要水果的種類進行分析
df.groupby(by='item')
<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x1152f1908>
#檢視詳細的分組情況
df.groupby(by='item').groups
{'Apple': Int64Index([0, 5], dtype='int64'),
 'Banana': Int64Index([1, 3], dtype='int64'),
 'Orange': Int64Index([2, 4], dtype='int64')}
  • 分組聚合
#計算出每一種水果的平均價格
df.groupby(by='item')['price'].mean()
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64
#計算每一種顏色對應水果的平均重量
df.groupby(by='color')['weight'].mean()
color
green     31.333333
red       12.000000
yellow    35.000000
Name: weight, dtype: float64
dic = df.groupby(by='color')['weight'].mean().to_dict()
#將計算出的平均重量彙總到源資料
df['mean_w'] = df['color'].map(dic)
df
item price color weight mean_w
0 Apple 4.0 red 12 12.000000
1 Banana 3.0 yellow 20 35.000000
2 Orange 3.0 yellow 50 35.000000
3 Banana 2.5 green 30 31.333333
4 Orange 4.0 green 20 31.333333
5 Apple 2.0 green 44 31.333333

高階資料聚合

  • 使用groupby分組後,也可以使用transform和apply提供自定義函式實現更多的運算
  • df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
  • transform和apply都會進行運算,在transform或者apply中傳入函式即可
  • transform和apply也可以傳入一個lambda表示式
def my_mean(s):
    m_sum = 0
    for i in s:
        m_sum += i
    return m_sum / len(s)
df.groupby(by='item')['price'].transform(my_mean)
0    3.00
1    2.75
2    3.50
3    2.75
4    3.50
5    3.00
Name: price, dtype: float64
df.groupby(by='item')['price'].apply(my_mean)
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64

資料載入

  • 讀取type-.txt檔案資料
df = pd.read_csv('./data/type-.txt')
df
你好-我好-他也好
0 也許-大概-有可能
1 然而-未必-不見得
df.shape
(2, 1)
  • 將檔案中每一個詞作為元素存放在DataFrame中
pd.read_csv('./data/type-.txt',header=None,sep='-')
0 1 2
0 你好 我好 他也好
1 也許 大概 有可能
2 然而 未必 不見得
  • 讀取資料庫中的資料
#連線資料庫,獲取連線物件
import sqlite3 as sqlite3
conn = sqlite3.connect('./data/weather_2012.sqlite')
#讀取庫表中的資料值
sql_df=pd.read_sql('select * from weather_2012',conn)
sql_df
index Date/Time Temp (C) Dew Point Temp (C) Rel Hum (%) Wind Spd (km/h) Visibility (km) Stn Press (kPa) Weather
0 0.0 2012-01-01 00:00:00 -1.8 -3.9 86.0 4.0 8.0 101.24 Fog
1 1.0 2012-01-01 01:00:00 -1.8 -3.7 87.0 4.0 8.0 101.24 Fog
2 2.0 2012-01-01 02:00:00 -1.8 -3.4 89.0 7.0 4.0 101.26 Freezing Drizzle,Fog
3 3.0 2012-01-01 03:00:00 -1.5 -3.2 88.0 6.0 4.0 101.27 Freezing Drizzle,Fog
4 4.0 2012-01-01 04:00:00 -1.5 -3.3 88.0 7.0 4.8 101.23 Fog
5 5.0 2012-01-01 05:00:00 -1.4 -3.3 87.0 9.0 6.4 101.27 Fog
6 6.0 2012-01-01 06:00:00 -1.5 -3.1 89.0 7.0 6.4 101.29 Fog
7 7.0 2012-01-01 07:00:00 -1.4 -3.6 85.0 7.0 8.0 101.26 Fog
8 8.0 2012-01-01 08:00:00 -1.4 -3.6 85.0 9.0 8.0 101.23 Fog
9 9.0 2012-01-01 09:00:00 -1.3 -3.1 88.0 15.0 4.0 101.20 Fog
10 10.0 2012-01-01 10:00:00 -1.0 -2.3 91.0 9.0 1.2 101.15 Fog
11 11.0 2012-01-01 11:00:00 -0.5 -2.1 89.0 7.0 4.0 100.98 Fog
12 12.0 2012-01-01 12:00:00 -0.2 -2.0 88.0 9.0 4.8 100.79 Fog
13 13.0 2012-01-01 13:00:00 0.2 -1.7 87.0 13.0 4.8 100.58 Fog
14 14.0 2012-01-01 14:00:00 0.8 -1.1 87.0 20.0 4.8 100.31 Fog
15 15.0 2012-01-01 15:00:00 1.8 -0.4 85.0 22.0 6.4 100.07 Fog
16 16.0 2012-01-01 16:00:00 2.6 -0.2 82.0 13.0 12.9 99.93 Mostly Cloudy
17 17.0 2012-01-01 17:00:00 3.0 0.0 81.0 13.0 16.1 99.81 Cloudy
18 18.0 2012-01-01 18:00:00 3.8 1.0 82.0 15.0 12.9 99.74 Rain
19 19.0 2012-01-01 19:00:00 3.1 1.3 88.0 15.0 12.9 99.68 Rain
20 20.0 2012-01-01 20:00:00 3.2 1.3 87.0 19.0 25.0 99.50 Cloudy
21 21.0 2012-01-01 21:00:00 4.0 1.7 85.0 20.0 25.0 99.39 Cloudy
22 22.0 2012-01-01 22:00:00 4.4 1.9 84.0 24.0 19.3 99.32 Rain Showers
23 23.0 2012-01-01 23:00:00 5.3 2.0 79.0 30.0 25.0 99.31 Cloudy
24 24.0 2012-01-02 00:00:00 5.2 1.5 77.0 35.0 25.0 99.26 Rain Showers
25 25.0 2012-01-02 01:00:00 4.6 0.0 72.0 39.0 25.0 99.26 Cloudy
26 26.0 2012-01-02 02:00:00 3.9 -0.9 71.0 32.0 25.0 99.26 Mostly Cloudy
27 27.0 2012-01-02 03:00:00 3.7 -1.5 69.0 33.0 25.0 99.30 Mostly Cloudy
28 28.0 2012-01-02 04:00:00 2.9 -2.3 69.0 32.0 25.0 99.26 Mostly Cloudy
29 29.0 2012-01-02 05:00:00 2.6 -2.3 70.0 32.0 25.0 99.21 Mostly Cloudy
... ... ... ... ... ... ... ... ... ...
8756 8756.0 2012-12-30 20:00:00 -13.8 -16.5 80.0 24.0 25.0 101.52 Clear
8757 8757.0 2012-12-30 21:00:00 -13.8 -16.5 80.0 20.0 25.0 101.50 Mainly Clear
8758 8758.0 2012-12-30 22:00:00 -13.7 -16.3 81.0 19.0 25.0 101.54 Mainly Clear
8759 8759.0 2012-12-30 23:00:00 -12.1 -15.1 78.0 28.0 25.0 101.52 Mostly Cloudy
8760 8760.0 2012-12-31 00:00:00 -11.1 -14.4 77.0 26.0 25.0 101.51 Cloudy
8761 8761.0 2012-12-31 01:00:00 -10.7 -14.0 77.0 15.0 25.0 101.50 Cloudy
8762 8762.0 2012-12-31 02:00:00 -10.1 -13.4 77.0 9.0 25.0 101.45 Cloudy
8763 8763.0 2012-12-31 03:00:00 -11.8 -14.4 81.0 6.0 25.0 101.42 Mostly Cloudy
8764 8764.0 2012-12-31 04:00:00 -10.5 -12.8 83.0 11.0 25.0 101.34 Cloudy
8765 8765.0 2012-12-31 05:00:00 -10.2 -12.4 84.0 6.0 25.0 101.28 Cloudy
8766 8766.0 2012-12-31 06:00:00 -9.7 -11.7 85.0 4.0 25.0 101.23 Cloudy
8767 8767.0 2012-12-31 07:00:00 -9.3 -11.3 85.0 0.0 19.3 101.19 Snow Showers
8768 8768.0 2012-12-31 08:00:00 -8.6 -10.3 87.0 4.0 3.2 101.14 Snow Showers
8769 8769.0 2012-12-31 09:00:00 -8.1 -9.6 89.0 4.0 2.4 101.09 Snow
8770 8770.0 2012-12-31 10:00:00 -7.4 -8.9 89.0 4.0 6.4 101.05 Snow,Fog
8771 8771.0 2012-12-31 11:00:00 -6.7 -7.9 91.0 9.0 9.7 100.93 Snow
8772 8772.0 2012-12-31 12:00:00 -5.8 -7.5 88.0 4.0 12.9 100.78 Snow
8773 8773.0 2012-12-31 13:00:00 -4.6 -6.6 86.0 4.0 12.9 100.63 Snow
8774 8774.0 2012-12-31 14:00:00 -3.4 -5.7 84.0 6.0 11.3 100.57 Snow
8775 8775.0 2012-12-31 15:00:00 -2.3 -4.6 84.0 9.0 9.7 100.47 Snow
8776 8776.0 2012-12-31 16:00:00 -1.4 -4.0 82.0 13.0 12.9 100.40 Snow
8777 8777.0 2012-12-31 17:00:00 -1.1 -3.3 85.0 19.0 9.7 100.30 Snow
8778 8778.0 2012-12-31 18:00:00 -1.3 -3.1 88.0 17.0 9.7 100.19 Snow
8779 8779.0 2012-12-31 19:00:00 0.1 -2.7 81.0 30.0 9.7 100.13 Snow
8780 8780.0 2012-12-31 20:00:00 0.2 -2.4 83.0 24.0 9.7 100.03 Snow
8781 8781.0 2012-12-31 21:00:00 -0.5 -1.5 93.0 28.0 4.8 99.95 Snow
8782 8782.0 2012-12-31 22:00:00 -0.2 -1.8 89.0 28.0 9.7 99.91 Snow
8783 8783.0 2012-12-31 23:00:00 0.0 -2.1 86.0 30.0 11.3 99.89 Snow
8784 NaN None NaN NaN NaN NaN NaN NaN Fog
8785 NaN None NaN NaN NaN NaN NaN NaN Fog

8786 rows × 9 columns

#將一個df中的資料值寫入儲存到db
df.to_sql('sql_data456',conn)

透視表

  • 透視表是一種可以對資料動態排布並且分類彙總的表格格式。或許大多數人都在Excel使用過資料透視表,也體會到它的強大功能,而在pandas中它被稱作pivot_table。

  • 透視表的優點:

    • 靈活性高,可以隨意定製你的分析計算要求
    • 脈絡清晰易於理解資料
    • 操作性強,報表神器
import pandas as pd
import numpy as np
df = pd.read_csv('./data/透視表-籃球賽.csv',encoding='utf8')
df
對手 勝負 主客場 命中 投籃數 投籃命中率 3分命中率 籃板 助攻 得分
0 勇士 10 23 0.435 0.444 6 11 27
1 國王 8 21 0.381 0.286 3 9 27
2 小牛 10 19 0.526 0.462 3 7 29
3 灰熊 8 20 0.400 0.250 5 8 22
4 76人 10 20 0.500 0.250 3 13 27
5 黃蜂 8 18 0.444 0.400 10 11 27
6 灰熊 6 19 0.316 0.222 4 8 20
7 76人 8 21 0.381 0.429 4 7 29
8 尼克斯 9 23 0.391 0.353 5 9 31
9 老鷹 8 15 0.533 0.545 3 11 29
10 爵士 19 25 0.760 0.875 2 13 56
11 騎士 8 21 0.381 0.429 11 13 35
12 灰熊 11 25 0.440 0.429 4 8 38
13 步行者 9 21 0.429 0.250 5 15 26
14 猛龍 8 25 0.320 0.273 6 11 38
15 太陽 12 22 0.545 0.545 2 7 48
16 灰熊 9 20 0.450 0.500 5 7 29
17 掘金 6 16 0.375 0.143 8 9 21
18 尼克斯 12 27 0.444 0.385 2 10 37
19 籃網 13 20 0.650 0.615 10 8 37
20 步行者 8 22 0.364 0.333 8 10 29
21 湖人 13 22 0.591 0.444 4 9 36
22 爵士 8 19 0.421 0.333 5 3 29
23 開拓者 16 29 0.552 0.571 8 3 48
24 鵜鶘 8 16 0.500 0.400 1 17 26

pivot_table有四個最重要的引數index、values、columns、aggfunc

  • index引數:分類彙總的分類條件

    • 每個pivot_table必須擁有一個index。如果想檢視哈登對陣每個隊伍的得分則需要對每一個隊進行分類並計算其各類得分的平均值:
  • 想看看哈登對陣同一對手在不同主客場下的資料,分類條件為對手和主客場

df.pivot_table(index=['對手','主客場'])
3分命中率 助攻 命中 得分 投籃命中率 投籃數 籃板
對手 主客場
76人 0.4290 7.0 8.0 29.0 0.381 21.0 4.0
0.2500 13.0 10.0 27.0 0.500 20.0 3.0
勇士 0.4440 11.0 10.0 27.0 0.435 23.0 6.0
國王 0.2860 9.0 8.0 27.0 0.381 21.0 3.0
太陽 0.5450 7.0 12.0 48.0 0.545 22.0 2.0
小牛 0.4620 7.0 10.0 29.0 0.526 19.0 3.0
尼克斯 0.3850 10.0 12.0 37.0 0.444 27.0 2.0
0.3530 9.0 9.0 31.0 0.391 23.0 5.0
開拓者 0.5710 3.0 16.0 48.0 0.552 29.0 8.0
掘金 0.1430 9.0 6.0 21.0 0.375 16.0 8.0
步行者 0.3330 10.0 8.0 29.0 0.364 22.0 8.0
0.2500 15.0 9.0 26.0 0.429 21.0 5.0
湖人 0.4440 9.0 13.0 36.0 0.591 22.0 4.0
灰熊 0.3395 8.0 9.5 30.0 0.420 22.5 4.5
0.3610 7.5 7.5 24.5 0.383 19.5 4.5
爵士 0.8750 13.0 19.0 56.0 0.760 25.0 2.0
0.3330 3.0 8.0 29.0 0.421 19.0 5.0
猛龍 0.2730 11.0 8.0 38.0 0.320 25.0 6.0
籃網 0.6150 8.0 13.0 37.0 0.650 20.0 10.0
老鷹 0.5450 11.0 8.0 29.0 0.533 15.0 3.0
騎士 0.4290 13.0 8.0 35.0 0.381 21.0 11.0
鵜鶘 0.4000 17.0 8.0 26.0 0.500 16.0 1.0
黃蜂 0.4000 11.0 8.0 27.0 0.444 18.0 10.0
  • values引數:需要對計算的資料進行篩選
    • 如果我們只需要哈登在主客場和不同勝負情況下的得分、籃板與助攻三項資料:
df.pivot_table(index=['主客場','勝負'],values=['得分','籃板','助攻'])
助攻 得分 籃板
主客場 勝負
10.555556 34.222222 5.444444
8.666667 29.666667 5.000000
9.000000 32.000000 4.916667
8.000000 20.000000 4.000000
  • Aggfunc引數:設定我們對資料聚合時進行的函式操作

    • 當我們未設定aggfunc時,它預設aggfunc='mean'計算均值。
  • 還想獲得james harden在主客場和不同勝負情況下的總得分、總籃板、總助攻時:

df.pivot_table(index=['主客場','勝負'],values=['得分','籃板','助攻'],aggfunc='sum')
助攻 得分 籃板
主客場 勝負
95 308 49
26 89 15
108 384 59
8 20 4
  • Columns:可以設定列層次欄位
    • 對values欄位進行分類
#獲取所有隊主客場的總得分
df.pivot_table(index='主客場',values='得分',aggfunc='sum')
得分
主客場
397
404
#獲取每個隊主客場的總得分(在總得分的基礎上又進行了對手的分類)
df.pivot_table(index='主客場',values='得分',columns='對手',aggfunc='sum',fill_value=0)
對手 76人 勇士 國王 太陽 小牛 尼克斯 開拓者 掘金 步行者 湖人 灰熊 爵士 猛龍 籃網 老鷹 騎士 鵜鶘 黃蜂
主客場
29 0 0 0 29 37 0 21 29 0 60 56 38 37 0 35 26 0
27 27 27 48 0 31 48 0 26 36 49 29 0 0 29 0 0 27

交叉表

  • 是一種用於計算分組的特殊透檢視,對資料進行彙總
  • pd.crosstab(index,colums)
    • index:分組資料,交叉表的行索引
    • columns:交叉表的列索引
import pandas as pd
from pandas import DataFrame
df = DataFrame({'sex':['man','man','women','women','man','women','man','women','women'],
               'age':[15,23,25,17,35,57,24,31,22],
               'smoke':[True,False,False,True,True,False,False,True,False],
               'height':[168,179,181,166,173,178,188,190,160]})
df
sex age smoke height
0 man 15 True 168
1 man 23 False 179
2 women 25 False 181
3 women 17 True 166
4 man 35 True 173
5 women 57 False 178
6 man 24 False 188
7 women 31 True 190
8 women 22 False 160
  • 求出各個性別抽菸的人數
pd.crosstab(df.smoke,df.sex)
sex man women
smoke
False 2 3
True 2 2
  • 求出各個年齡段抽菸人情況
pd.crosstab(df.age,df.smoke)
smoke False True
age
15 0 1
17 0 1
22 1 0
23 1 0
24 1 0
25 1 0
31 0 1
35 0 1
57 1 0