Pandas用法總結

Pandas用法總結

Pandas簡介

Pandas是基於NumPy的一種工具,該工具是爲了解決數據分析任務而創建的。Pandas納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據庫所需的工具。Pandas提供了大量能使我們快速便捷地處理數據的函數和方法。Pandas基於兩種數據類型:series 和 dataframe

Series

Series是Pandas中最基本的對象,類似一維數組。事實上,Series基本上就是基於NumPy的數組對象來的,和NumPy的數組不同,Series能爲數據自定義標籤,也就是索引(index),然後通過索引來訪問數組中的數據。用法總結如下:


Series對象的創建

# pandas 學習
import pandas as pd
from pandas import Series,DataFrame
import numpy as np

# 一維數組
sel = Series([1,2,3,4])
# 會同時打印索引和對應的元素
print(sel)

# 但通常我們會自己創建索引 index代表索引
# sel= Series(data=[1,2,3,4],index=['a','b','c','d'])
sel = Series(data=[1,2,3,4],index=list('abcd'))
print('數組:')
print(sel)
# 獲取內容
print('數組值:',sel.values)
# 獲取索引
print('數組下標',sel.index)
# 同時獲取索引和值
print('同時獲取索引和對應值',list(sel.iteritems()))

# 將字典轉換爲Series
dict = {'red':100,'back':400,'green':300,'pink':900}
se3 = Series(dict)
print(se3)

Series數據獲取

# Series 數據獲取

sel = Series(data = [1,2,3,4], index = list('abcd'))
print(sel)

# Series 對象同時支持位置和標籤兩種方式獲取數據
print('索引下標:',sel['c'])
print('位置下標:',sel[2])

# 獲取不連續的數據
print('索引下標:')
print(sel[['a','c']])
print('位置下標:')
print(sel[[1,3]])

# 可以使用切片 取數據
print('位置切片:') 
print(sel[1:3])        # 左包含右不包含
print('索引切片:')      
print(sel['b' : 'd'])    # 左右都包含

# 重新賦值索引的值
sel.index = list('dcba')
print(sel)
# reindex 重新索引,會返回一個新的Series(調用reindex將會重新排序,缺失值用NaN填補)
print(sel.reindex(['b','a','c','d','e']))

# drop() 丟棄指定軸上的項
sel = pd.Series(range(10,15))
print(sel)
# drop 
print(sel.drop([2,3]))

Series算術運算

# Series 進行算術運算
# 對 Series 的算術運算都是基於 index 來進行的
# 我們可以用 加減乘除(+,-,* ,/)這樣的運算對兩個 Series 進行運算
# pandas 根據索引 index 對響應的數據進行計算,結果將會以浮點數的形式儲存,以避免丟失精度
# 如果 pandas 在 兩個 Series 裏找不到相同的 index ,對應的位置就返回一個空值 NaN
# series(data ,index) 第一個是數據 第二個是索引 感覺有點彆扭
# 只有索引相同才進行計算,否則返回空值 NaN

series1 = pd.Series([1,2,3,4],['London','HongKong','HuBei','Lagos'])
series2 = pd.Series([1,3,6,4],['London','Accra','Lagos','Delhi'])

print(series1)
print('\n')
print(series2)
print('\n')
print(series1-series2)
print('\n')
print(series1+series2)
print('\n')
print(series1*series2)
print('\n')

# 同樣也支持numpy 的數組運算
sel = Series(data=[1,6,3,5],index=list('abcd'))
print('原數組:')
print('\n')
print(sel)
print('\n')
print(sel[sel>3]) # 布爾數組過濾 值大於3
print('\n')
print(sel * 2) # 標量乘法
print('\n')
print(np.square(sel)) # 可以直接加入到numpy的數學函數 平方

DataFrame

DataFrame的創建

# DataFrame 的創建
# 二維數據結構(表格形式儲存)
# 三個參數 data index columns 分別代表 數據 行索引 列索引
# 使用二維數組
df1 = DataFrame(np.random.randint(0,10,(4,4)),index=[1,2,3,4],columns=['a','b','c','d'])
print(df1)

運行結果:
a b c d
1 2 9 6 1
2 0 5 5 0
3 4 4 7 8
4 4 3 5 2


# 使用字典進行創建(行索引由index決定,列索引由字典的鍵決定)
dict = {
    'Province': ['Guangdong','Beijing','Qinghai','Fujian'],
    'pop': [1.3, 2.5, 1.1, 0.7],
    'year': [2018, 2018, 2018, 2018]
}
df2 = pd.DataFrame(dict,index=[1,2,3,4])
print(df2)

# 使用 from_dict
dict2 = {'a':[1,2,3],'b':[4,5,6]}
df6 = pd.DataFrame.from_dict(dict2)
print(df6)

# 索引相同的情況下,相同索引的值會相對應,缺少的值會添加NaN
data={
    'Name':pd.Series(['zs','ls','we'],index=['a','b','c']),
    'Age':pd.Series(['10','20','30','40'],index=['a','b','c','d']),
    'country':pd.Series(['中國','日本','韓國'],index=['a','c','b'])
}
df3 = pd.DataFrame(data)
print(df3)

# to_dict() 方法將DataFrame 對象轉換爲字典
dict = df3.to_dict()
print(dict)

運行結果:
Province pop year
1 Guangdong 1.3 2018
2 Beijing 2.5 2018
3 Qinghai 1.1 2018
4 Fujian 0.7 2018
a b
0 1 4
1 2 5
2 3 6
Name Age country
a zs 10 中國
b ls 20 韓國
c we 30 日本
d NaN 40 NaN
{'Name': {'a': 'zs', 'b': 'ls', 'c': 'we', 'd': nan}, 'Age': {'a': '10', 'b': '20', 'c': '30', 'd': '40'}, 'country': {'a': '中國', 'b': '韓國', 'c': '日本', 'd': nan}}


DataFrame對象常用屬性

# DataFrame 常用屬性
df_dict={
    'name':['James','Curry','Iversion'],
    'age':['18','20','19'],
    'national':['us','China','us']
}
df = pd.DataFrame(data=df_dict,index=['0','1','2'])
print(df)
print('\n')
# 獲取行數和列數
print('DataFrame的大小:',df.shape)
# 獲取行索引
print('獲取DataFrame的行索引:',df.index.tolist())
# 獲取列索引
print('獲取DataFrame的列索引:',df.columns.tolist())
print('\n')
# 獲取數據的類型
print('獲取DataFrame的數據類型:')
print(df.dtypes)
print('\n')
# 獲取數據的維度
print('獲取數據的維度:',df.ndim)
print('\n')
# values屬性 也會以二維 ndarray 的形式返回 DataFrame 的數據
print('df的values屬性:')
print(df.values)
print('\n')

# 展示df的概覽
print('df的概覽:')
print(df.info())
print('\n')

# 顯示頭幾行 默認顯示五行
print(df.head(2))
print('\n')

# 顯示後幾行 默認顯示後五行
print(df.tail(1))
print('\n')

# 獲取DataFrame的列 
# 因爲我們只獲取一列,所以返回的是一個 Series
print(df['name'])
print(type(df['name']))
print('\n')

# 如果獲取的是多個列,那返回的就是一個 DataFrame 類型:
print(df[['name','age']])
print(type(df[['name','age']]))
print('\n')

# 獲取一行
print(df[0:1]) #左閉右開
print('\n')

# 取多行
print(df[1:3])
print('\n')

# 取多行裏面的某一列(不能進行多行多列的選擇)
# 注意 :df[]只能進行行選擇,或列選擇,不能同時多行多列選擇 print(df[1:3]['name','age'])
print(df[1:3][['name','age']])
print('\n')
df_dict={
    'name':['James','Curry','Iversion'],
    'age':['18','20','19'],
    'national':['us','China','us']
}
df = pd.DataFrame(data=df_dict,index=['0','1','2'])
print(df)
print('\n')

# df.loc 通過標籤索引行數據
# df.iloc 通過位置獲取行數據

# 獲取某一行某一列的數據
print(df.loc['0','name'])
print('\n')

# 一行所有列
print(df.loc['0',:])
print('\n')

# 某一行多列的數據
print(df.loc['0',['name','age']])
print('\n')

# 選擇間隔的多行多列
print(df.loc[['0','2'],['name','national']])
print('\n')

# 選擇連續的多行和間隔的多列
print(df.loc['0':'2',['name','national']])
print('\n')

# df.iloc 通過位置獲取行數據 練習

# 取一行
print(df.iloc[1])
print('\n')

# 取連續多行
print(df.iloc[0:2]) #左閉右開
print('\n')

# 取間斷的多行
print(df.iloc[[0,2],:])
print('\n')

# 取某一列
print(df.iloc[:,1].tolist())
print('\n')

# 按照座標取某一個值
print(df.iloc[1,0])
print('\n')

# 修改值
df.iloc[0,0]='pandas'
print(df)

# DataFrame 中的排序方法
# ascending=False :降序排列 默認是升序
df = df.sort_values(by='age',ascending=False)
print(df)

DataFrame修改index columns

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

# dataframe 修改 行索引(index) 和 列索引(columns)

df1 = pd.DataFrame(np.arange(9).reshape(3,3),index=['bj','sh','gz'],columns= ['a','b','c'])
print(df1)

# 修改 df1 的索引
# df1.index = ['beijing','shanghai','guangzhou']
# print(df1)

# 自定義map函數(x 是原有的行列值)
def test_map(x):
    return x + '_ABC'

# inplace: 布爾值 ,默認爲False 指定是否要返回新的DataFrame對象。如果爲True,則在原df上進行修改
print(df1.rename(index=test_map,columns=test_map,inplace=False))
print(df1)

# 同時,rename 還可以傳入字典,爲某個 index 單獨修改名稱
df3 = df1.rename(index={'bj':'beijing'},columns={'a':'aa'})
print(df3)

# 列轉化爲索引
df1 = pd.DataFrame({'X':range(5),'Y':range(5),'S':list('abcde'),'Z':[1,1,2,2,2]})
print(df1)
print('\n')
# 指定一列爲行索引(drop = False 指定同時保留作爲索引的列)
result =  df1.set_index('S',drop=False)
result.index.name = None
print(result)
print('\n')

# 指定一行行轉化爲列索引
result =df1.set_axis(df1.iloc[0],axis=1,inplace=False)
result.columns.name = None
print(result)

添加及刪除數據

# 添加元素
df1 = pd.DataFrame([['Snow','M',22],['Tyrion','M',22],['Snana','F',18],['Arya','F',14]],
                    columns=['name','gender','age'])
# 在數據最後再加上 score 一列
df1['score'] = [80,98,67,90] #增加列的元素個數要和原數據列的個數一樣
print(df1)
print('\n')

col_name = df1.columns.tolist() # 將數據框中的列名全部提取出來放在列表裏
col_name.insert(2,'city')
df1 = df1.reindex(columns=col_name)
print(df1)
print('\n')
# 給city列索引進行賦值
df1['city']=['北京','山西','湖北','澳門']
print(df1)

# df.insert(loc,column,value)
# lioc 要插入的位置 column 列名 value 值 前提:該列索引要不存在
# df1.insert(2,'score',[80,98,67,90])
# print(df1)
#  插入一行
df1 = pd.DataFrame([['Snow','M',22],['Tyrion','M',22],['Snana','F',18],['Arya','F',14]],
                    columns=['name','gender','age'])
print(df1)
print('\n')


# 先創建一個新的DataFrame對象,用來增加數據框的最後一行
new = pd.DataFrame({'name':'lisa',
                    'gender':'F',
                    'age':19
                   },index=[0])
print(new)
print('\n')
print('在原始數據df1最後一行新增一行,用append方法:')
# ignore_index=False表示不按原來的索引,從0開始自動遞增
df1=df1.append(new,ignore_index=True)
print(df1)
# 合併對象
# ohjs:合併對象
# axis: 合併方式 ,默認0 表示按列進行合併,1表示按行合併
# ignore_index: 是否忽略索引

df1 = pd.DataFrame(np.arange(6).reshape(3,2),columns=['four','five'])
df2 = pd.DataFrame(np.arange(6).reshape(2,3),columns=['one','two','three'])
print('df1:')
print(df1)
print('df2:')
print(df2)

# 按行合併
result = pd.concat([df1,df2],axis=1)
print(result)

# 按列合併
result = pd.concat([df1,df2],axis=0,ignore_index=True)
print(result)
# DataFrame的刪除
# labels:要刪除數據的標籤
# axis: 0表示刪除行,1表示刪除列,默認0
# inplace: 是否在當前df中執行此操作

df2 = pd.DataFrame(np.arange(9).reshape(3,3),columns=['one','two','three'])
print(df2)
df3 = df2.drop(['one'],axis=1,inplace = False)
print(df3)
print(df2)

數據處理

# 數組處理
from numpy import nan as NaN

# 通過 ** dropna() ** 過濾缺失數據
se = pd.Series([4,NaN,8,NaN,5])
print(se.tolist())
# 去掉無意義的值(NaN)
print(se.dropna().tolist())
print(se.notnull().tolist())
print(se.isnull().tolist())

# 通過 布爾序列 也能進行濾除
print(se[se.notnull()].tolist())
# 二維數組的過濾
df1 = pd.DataFrame([[1,2,3],[NaN,NaN,2],[NaN,NaN,NaN],[8,8,NaN]])
print(df1)
print('\n')

# 默認消除所有包含 NaN 的列或行:
print(df1.dropna())
print('\n')

# 傳入 how = 'all' 濾除全爲 NaN 的行
print(df1.dropna(how = 'all')) #默認情況下是 any ,只要有 nan 就刪除
print('\n')


# 傳入 axis = 1 濾除列
print(df1.dropna(axis=1,how='all'))
print('\n')

# 傳入 thresh = n 保留至少有 n 個非 NaN 數據的 行:
print(df1.dropna(thresh=1))
# 填充缺失數據
df1 = pd.DataFrame([[1,2,3],[NaN,NaN,2],[NaN,NaN,NaN],[8,8,NaN]])
print(df1)
print('\n')

# 用常數填充 fillna
print(df1.fillna(0))
print('\n')
# 傳入 inplace = True 直接修改 原對象
# df1.fillna(0,inplace = True)
# print(df1)

# 通過字典填充不同的常數 這裏的0,1,2 表示列索引
print(df1.fillna({0:10,1:20,2:30}))
print('\n')

# 填充平均值
print(df1.fillna(df1.mean()))
print('\n')

# 如果只填充一列
print(df1.iloc[:,1].fillna(5,inplace = True))
print(df1)
print('\n')
# 傳入 mothod = '' 改變插值方式:

df2 = pd.DataFrame(np.random.randint(0, 10, (5, 5)))
print(df2)
print('\n')
df2.iloc[1:4, 3] = np.nan
df2.iloc[2:4, 4] = np.nan
print(df2)
print('\n')

# 使用  (行)上面的值來填充 ffill  用後面的值來填充 bfill
print(df2.fillna(method='ffill'))
print('\n')

# 使用 limit= '' 限制填充行數:
print(df2.fillna(method='ffill', limit=1))
print('\n')
# axis 控制方向 1 表示列 這裏是只填充一列 ,使用左邊的值進行填充
print(df2.fillna(method='ffill', limit=1, axis=1))
# 移除重複數據
# dataframe 中經常會出現重複行,利用 duplicated() 函數 返回每一行判斷是否重複的結果
# 重複爲 True

df1 = pd.DataFrame({'A': [1, 1, 1, 2, 2, 3, 1], 'B': list('aabbbca')})
print(df1)
print('\n')

# 判斷每一行是否重複(結果是 bool值,TRUE 代表重複的)
print(df1.duplicated().tolist())
print('\n')

# 去除全部的重複行
print(df1.drop_duplicates())
print('\n')

# 指定列去除重複行
print(df1.drop_duplicates(['A']))
print('\n')

# 保留重複行中的最後一行
print(df1.drop_duplicates(['A'], keep='last'))
print('\n')

# 去除重複的同時改變DataFrame對象
df1.drop_duplicates(['A', 'B'], inplace=True)
print(df1)

數據合併

# 數據合併

# 使用 join 合併 着重關注的是行的合併

import pandas as pd

df3 = pd.DataFrame({'Red':[1,3,5],'Green':[5,0,3]},index=list('abc'))
df4 = pd.DataFrame({'Blue':[1,9,8],'Yellow':[6,6,7]},index=list('cde'))
print(df3)
print(df4)

# 簡單合併(默認是left 左連接,以左側 dfs 爲例)
# 左連接
# df3.join(df4,how='left')
# 右連接
# df3.join(df4,how='right')
# 外連接
# df3.join(df4,how='outer')

# 合併多個DataFrame對象 
df5 = pd.DataFrame({'Brown':[3,4,5],'White':[1,1,2]},index=list('aed'))
df3.join([df4,df5])
# 使用merge,看重的是列合併
df1 = pd.DataFrame({'名字': list('ABCDE'), '性別': ['男', '女', '男', '男', '女'], '職稱':
                    ['副教授', '講師', '助教', '教授', '助教']}, index=range(1001, 1006))
df1.columns.name = '學院老師'
df1.index.name = '編號'
print(df1)
print('\n')

df2 = pd.DataFrame({'名字': list('ABDAX'), '課程': ['C++', '計算機導論', '彙編', '數據結構', '馬克思原理'], '職稱':
                    ['副教授', '講師', '教授', '副教授', '講師']}, index=range(1001, 1006))
df2.columns.name = '課程'
df1.index.name = '編號'
print(df2)
print('\n')

# 默認下是根據左右對象中出現同名的列作爲連接的鍵,且連接方式是 how = 'inner'
print(pd.merge(df1,df2)) #返回匹配的
print('\n')

# 指定列名合併
# pd.merge(df1,df2,on='名字',suffixes=['_1','_2']) # 返回匹配的

# 連接方式,根據左側爲準
pd.merge(df1,df2,how='left')

# 根據右側爲準
pd.merge(df1,df2,how='right')

# 所有
pd.merge(df1,df2,how='outer')

# 根據多個鍵進行連接
pd.merge(df1,df2,on=['職稱','名字'])

多層索引(擴展)

# 多級索引
# Series
s = Series(np.random.randint(0, 150, size=6), index=[['a', 'a', 'b', 'b', 'c', 'c'],
                                                     ['期中', '期末', '期中', '期末', '期中', '期末']])
print(s)
print('\n')

# 取一個第一級索引
print(s['a'])
print('\n')

# 取多個第一級索引
print(s[['a','b']])
print('\n')

# 根據索引獲取值
print(s['a','期末'])
print('\n')

# loc 方法取值
print(s.loc['a'])
print(s.loc[['a','b']])
print(s.loc['a','期末'])
print('\n')

# iloc 方法取值(iloc 計算的是最內層索引)
print(s.iloc[1])
print(s.iloc[1:4])

時間序列

# 時間序列
import pandas as pd 
import numpy as np

# 生成一段時間範圍
data = pd.date_range(start='20190501',end='20190530')
print(data)

# freg: 日期偏移量 取值爲 string 或 DateOffset,默認爲'D', freg='1h30min'
# freg ='10D'
# periods;固定時期,取值爲整數或None 就是生成幾個數據

date = pd.date_range(start='20190501',periods=10,freq='10D')
print(date)
# 時間序列在series中的作用
# 可以將時間作爲索引
index = pd.date_range(start='20190101', periods=10)
df = pd.Series(np.random.randint(0,10,size=10),index=index)
print(df)

# truncate 這個函數 根據日期過濾 before 之後的日期  after :之前的日期
after = df.truncate(after='2019-01-2')
print(after) 
# 日期的一些常見屬性
long_ts = pd.Series(np.random.randn(
    1000), index=pd.date_range('1/1/2019', periods=1000))
print(long_ts)
print('\n')

# 根據年份獲取 
# result = long_ts['2020']
# print(result)
# print('\n')

# 根據年份和日期獲取
# result = long_ts['2020-05']
# print(result)

# 使用切片
# result = long_ts['2020-05-01':'2020-05-06']
# print(result)

# 通過between_time()返回指定時間段的數據集
index = pd.date_range('2018-03-17', '2018-03-30', freq='2H')
ts = pd.Series(np.random.randn(157), index=index)
print(ts.between_time('7:00', '17:00'))
print('\n')

# 這些操作也適用於dataframe
index = pd.date_range('1/1/2019',periods=100)
df =  pd.DataFrame(np.random.rand(100,4),index=index)
print(df.loc['2019-04'])

分組聚合(常用)

# 分組聚合

df = pd.DataFrame({
    'name': ['BOSS', 'Lilei', 'Lilei', 'Han', 'BOSS', 'BOSS', 'Han', 'BOSS'],
    'Year': [2016, 2016, 2016, 2016, 2017, 2017, 2017, 2017],
    'Salary': [999999, 20000, 25000, 3000, 9999999, 999999, 3500, 999999],
    'Bonus': [100000, 20000, 20000, 5000, 200000, 300000, 3000, 400000]
})
print(df)

# 根據name 這一列進行分組
group_by_name = df.groupby('name')
print(type(group_by_name))
# 查看分組
print('\n')
print(group_by_name.groups)
print('\n')
# 分組後的數量
print(group_by_name.count())
print('\n')

# 查看分組的情況
for name,group in group_by_name:
    print(name)  # 組的名字
    print(group) # 組具體內容

print('\n')
# 可以選擇分組
print(group_by_name.get_group('BOSS'))
print('\n')

# 按照某一列進行分組 ,將name 這一列作爲分組的鍵,對year 進行分組
group_by_name = df['Year'].groupby(df['name'])
print(group_by_name.count())
print('\n')

# 按照多列進行分組
group_by_name_year = df.groupby(['name','Year'])
print('分組數量:')
print(group_by_name_year.count())
print('按照多列進行分組:')
for name,group in group_by_name_year:
    print(name)
    print(group)
    
print('\n')
    
# 可以選擇分組
print(group_by_name_year.get_group(('BOSS',2016)))
# '''
# 聚合函數
# mean   計算分組平均值
# count  分組中非NA值的數量
# sum    非NA值的和
# median 非NA值的算術中位數
# std    標準差
# var    方差
# min    非NA值的最小值
# max    非NA值的最大值
# prod   非NA值的積
# first  第一個非NA值
# last   最後一個非NA值
# mad	   平均絕對偏差
# mode	模
# abs	    絕對值
# sem	平均值的標準誤差
# skew	樣品偏斜度(三階矩)
# kurt	樣品峯度(四階矩)
# quantile	樣本分位數(百分位上的值)
# cumsum	累積總和
# cumprod	累積乘積
# cummax	累積最大值
# cummin	累積最小值
# '''# '''
# 聚合函數
# mean   計算分組平均值
# count  分組中非NA值的數量
# sum    非NA值的和
# median 非NA值的算術中位數
# std    標準差
# var    方差
# min    非NA值的最小值
# max    非NA值的最大值
# prod   非NA值的積
# first  第一個非NA值
# last   最後一個非NA值
# mad	   平均絕對偏差
# mode	模
# abs	    絕對值
# sem	平均值的標準誤差
# skew	樣品偏斜度(三階矩)
# kurt	樣品峯度(四階矩)
# quantile	樣本分位數(百分位上的值)
# cumsum	累積總和
# cumprod	累積乘積
# cummax	累積最大值
# cummin	累積最小值
# '''
# 使用 agg()函數做聚合運算 通用 通過參數傳參
for name,group in df1.groupby('key1'):
    print(name)
    print(group)
print('\n')    
print(df1.groupby('key1').agg('sum'))
# 優勢在於可以同時做多個聚合運算
print(df1.groupby('key1').agg(['sum','mean','std']))

# agg()還可以傳入自定義函數 
def peak_range(df):
    return df.max()-df.min()
print(df1.groupby('key1').agg(peak_range))

print('\n')
print('同時應用多個聚合函數:')
# 同時應用多個聚合函數
print(df1.groupby('key1').agg(['mean','std','count',peak_range]))
print('\n')
# 通過元組提供新的列名 就是別名
print(df1.groupby('key1').agg(['mean','std','count',('range',peak_range)]))
print('\n')

print('給每列作用不同的函數:')
# 給每列作用不同的函數
dict_mapping = {
    'Data1':['mean','max'],
    'Data2':'sum'
}
print(df1.groupby('key1').agg(dict_mapping))
# apply() 函數 : pandas 中自由度最高的函數
# agg() 函數 只是用來數值計算,一些非數值會被過濾,存在缺陷

df1 = pd.DataFrame(
    {
        'sex': list('FFMFMMF'),
        'smoker': list('YNYYNYY'),
        'age': [21, 30, 17, 37, 40, 18, 26],
        'weight': [120, 100, 132, 140, 94, 89, 123]
    }
)

print(df1)
print('\n')

# 判斷抽菸年齡


def bin_age(age):
    if age >= 18:
        return '早日戒菸'
    else:
        return '很好啊啊'


print(df1['age'].apply(bin_age))
# df1['age']=df1['age'].apply(bin_age)
# print(df1)


# 取出抽菸和不抽菸的體重的前二
def top(smoker,col,n=5):
    return smoker.sort_values(by=col)[-n:]

df1.groupby('smoker').apply(top,col='weight',n=2)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章