pandas-dataframe常用操作
上一篇分享了pandas的資料讀取,這一節我們繼續分享在讀取資料獲得dataframe后的常用操作
import pandas as pd
一、dataframe查詢
1、查看dataframe的前幾行,后幾行,行列資訊,以及對數值型欄位資料進行描述統計
df= pd. read_excel( r'C:/Users/37957/Desktop/pandas_files/pandas_dataframe/hotel.xlsx' , index_col= '序號' )
df. head( ) #括號中不輸引數時,默認查詢前5行資料
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693元 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747元 4 香港灣仔帝盛酒店(Dorsett Wanchai) 浪漫情侶 灣仔 皇后大道東387-397號 4.4 5014.0 693元 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581元
df. tail( ) #括號中不輸引數時,默認查詢后5行資料
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 416 香港天天賓館(TIN TIN GUEST HOUSE) 地鐵周邊 油尖旺 旺角彌敦道607號新興大廈1517A 3.2 16.0 227元 417 香港AMR賓館(AMR Hostel) 地鐵周邊 NaN 尖沙咀彌敦道58號美麗都大廈6字樓A12室 NaN NaN 977元 418 香港如心海景酒店暨會議中心(L‘hotel Nina et Convention Centre) 海濱風光 荃灣 荃灣 楊屋道8號 4.5 45462.0 709元 419 香港如心海景酒店暨會議中心(L‘hotel Nina et Convention Centre) 海濱風光 荃灣 荃灣 楊屋道8號 4.5 45463.0 709元 420 香港花盈酒店(家庭旅館)(Bloomy Hotel) 地鐵周邊 油尖旺 尖沙咀彌敦道87號華源大廈9字樓C2室 4.0 273.0 256元
df. index
Int64Index([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
...
411, 412, 413, 414, 415, 416, 417, 418, 419, 420],
dtype='int64', name='序號', length=420)
df. info( )
<class 'pandas.core.frame.DataFrame'>
Int64Index: 420 entries, 1 to 420
Data columns (total 7 columns):
名稱 420 non-null object
關鍵字 389 non-null object
區域 350 non-null object
地址 420 non-null object
評價 371 non-null float64
點評人數 404 non-null float64
平均消費 413 non-null object
dtypes: float64(2), object(5)
memory usage: 26.2+ KB
df. describe( ) #對dataframe中數值型欄位進行描述統計
評價 點評人數 count 371.000000 404.000000 mean 4.283827 2483.262376 std 0.508264 4539.495778 min 1.500000 1.000000 25% 4.200000 87.000000 50% 4.400000 853.500000 75% 4.600000 3247.000000 max 4.900000 45463.000000
2、查看dataframe中資料的方法
幾種查詢方法: 1、通過直接選取的方法 2、df.loc方法,根據行,列的標簽值查詢 3、df.iloc方法,根據行,列的數字位置查詢 4、df.where方法 5、df.query方法 這里我只分享一下最為常見前兩種方法
df= df[ 0 : 5 ] # 為了方便顯示,只取檔案的前5行
df
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693元 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747元 4 香港灣仔帝盛酒店(Dorsett Wanchai) 浪漫情侶 灣仔 皇后大道東387-397號 4.4 5014.0 693元 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581元
1)直接選取的方法詢
使用一個列標簽或列標簽串列進行查詢,獲取一列或多列;使用切片則獲行,注意:使用索引位置序號切片結果不包含末端索引,使用索引標簽切片結果包含末端索引
print ( type ( df[ '名稱' ] ) )
print ( '-' * 30 )
df[ '名稱' ] # 使用一個值進行查詢,獲得的是一個series
<class 'pandas.core.series.Series'>
------------------------------
序號
1 香港嘉湖海逸酒店(Harbour Plaza Resort City)
2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)
3 香港碧薈酒店(The BEACON)
4 香港灣仔帝盛酒店(Dorsett Wanchai)
5 如心艾朗酒店(L‘hotel elan)
Name: 名稱, dtype: object
print ( type ( df[ [ '名稱' , '平均消費' ] ] ) )
print ( '-' * 30 )
df[ [ '名稱' , '平均消費' ] ] # 使用一個值進行查詢,獲得的是一個DataFrame
<class 'pandas.core.frame.DataFrame'>
------------------------------
名稱 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 422元 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 693元 3 香港碧薈酒店(The BEACON) 747元 4 香港灣仔帝盛酒店(Dorsett Wanchai) 693元 5 如心艾朗酒店(L‘hotel elan) 581元
df[ 0 : 2 ] #使用索引位置序號切片結果不包含末端索引
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693元
2)、df.loc方法,根據行,列的標簽值查詢
1、若行列都傳入某一個標簽,得到的是指定位置的資料,型別即為該資料的資料型別,注意:loc使用標簽切片包含末端項,iloc使用索引位置切片不包含末端項, 2、若引數里傳入單獨指定某一行,得到的是name為該行標簽Series,但如果以串列形式指定某一行如[1],得到的是DataFrame; 3、若行和列傳入的都是串列形式,得到的是DataFrame,當傳入多行單列時回傳的還是一個series 4、使用區間進行查詢,區間即包含開始也包含結束 5、使用條件運算式查詢
# 1、傳入某一個標簽
df. loc[ 1 , '名稱' ]
'香港嘉湖海逸酒店(Harbour Plaza Resort City)'
# 2.1、傳入單獨行
df. loc[ 1 ]
名稱 香港嘉湖海逸酒店(Harbour Plaza Resort City)
關鍵字 休閑度假
區域 元朗
地址 天水圍 天恩路18號
評價 4.6
點評人數 17604
平均消費 422元
Name: 1, dtype: object
# 2.2、以串列形式傳入單獨行
df. loc[ [ 1 ] ]
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元
# 3、行和列傳入的都是串列形式,回傳dataframe,當傳入多行單列時回傳的是一個series
df. loc[ [ 1 , 2 , 3 ] , [ '名稱' , '平均消費' ] ]
名稱 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 422元 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 693元 3 香港碧薈酒店(The BEACON) 747元
# 4、使用區間進行查詢,區間即包含開始也包含結束
df. loc[ 1 : 3 , '名稱' : '平均消費' ]
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693元 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747元
# 5、使用條件運算式查詢
df. loc[ df[ '評價' ] >= 4.6 , : ]
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747元 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581元
# 多條件查詢
df. loc[ ( df[ '關鍵字' ] == '休閑度假' ) & ( df[ '評價' ] >= 4.6 ) , : ]
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元
二、dataframe新增&修改資料列
1、直接賦值 2、分條件賦值 3、apply方法
# 將原dataframe中平均消費欄位的‘元’去掉
df #查看原dataframe
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693元 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747元 4 香港灣仔帝盛酒店(Dorsett Wanchai) 浪漫情侶 灣仔 皇后大道東387-397號 4.4 5014.0 693元 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581元
df[ '平均消費' ] = df[ '平均消費' ] . str . replace( '元' , '' ) . astype( 'int' ) # 去掉‘元’
df #再次查看dataframe
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747 4 香港灣仔帝盛酒店(Dorsett Wanchai) 浪漫情侶 灣仔 皇后大道東387-397號 4.4 5014.0 693 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581
# 直接賦值方法
df[ '總消費' ] = df[ '點評人數' ] * df[ '平均消費' ]
df
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 總消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422 7428888.0 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693 8806644.0 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747 245016.0 4 香港灣仔帝盛酒店(Dorsett Wanchai) 浪漫情侶 灣仔 皇后大道東387-397號 4.4 5014.0 693 3474702.0 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581 1991087.0
# 按條件分組賦值
df[ '評價等級' ] = ''
df. loc[ df[ '評價' ] >= 4.7 , '評價等級' ] = '評價高'
df. loc[ ( df[ '評價' ] < 4.7 ) & ( df[ '評價' ] >= 4.6 ) , '評價等級' ] = '評價中'
df. loc[ df[ '評價' ] < 4.6 , '評價等級' ] = '評價低'
df
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 總消費 評價等級 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422 7428888.0 評價中 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693 8806644.0 評價低 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747 245016.0 評價高 4 香港灣仔帝盛酒店(Dorsett Wanchai) 浪漫情侶 灣仔 皇后大道東387-397號 4.4 5014.0 693 3474702.0 評價低 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581 1991087.0 評價中
# apply方法
def get_level ( x) :
if x[ '平均消費' ] > 700 :
return '高等消費'
if x[ '平均消費' ] > 600 :
return '中等消費'
else :
return '普通消費'
df[ '消費等級' ] = df. apply ( get_level, axis= 1 )
df
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 總消費 評價等級 消費等級 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422 7428888.0 評價中 普通消費 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693 8806644.0 評價低 中等消費 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747 245016.0 評價高 高等消費 4 香港灣仔帝盛酒店(Dorsett Wanchai) 浪漫情侶 灣仔 皇后大道東387-397號 4.4 5014.0 693 3474702.0 評價低 中等消費 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581 1991087.0 評價中 普通消費
三、dataframe缺失值處理
1、缺失值的檢測:isna與isnull 2、缺失值洗掉:dropna,默認值0 axis:洗掉行還是列,0或者index,洗掉行;1或者columns,洗掉列 how:如果等于any任意值為空就洗掉,如果等于all則所有值為空才洗掉 inplace:如果為true,則替換當前dataframe,為false時,回傳新的dataframe 3、填充空值:fillna value:用于填充的值,可以是單個值,也可以是dict/Series/DataFrame, method:默認值None,等于ffill時,使用前一個不為空的值填充,等于bfill時,使用后一個不為空的值填充, axis:按照行還是列,0或者index,行;1或者columns,列 inplace:如果為true,則替換當前dataframe,為false時,回傳新的dataframe
df1= pd. read_excel( r'C:/Users/37957/Desktop/pandas_files/pandas_dataframe/hotel.xlsx' , index_col= '序號' ) # 讀取excel檔案
df1. fillna( { '評價' : 0 } ) . head( ) # 將評價欄位的空值以0填充,查看前5行
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693元 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747元 4 香港灣仔帝盛酒店(Dorsett Wanchai) 浪漫情侶 灣仔 皇后大道東387-397號 4.4 5014.0 693元 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581元
df1[ '評價' ] . fillna( method= 'ffill' , inplace= True ) # 將評價欄位的空值以前一個不為空的值填充
df1. head( ) # 查看前5行
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 1 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休閑度假 元朗 天水圍 天恩路18號 4.6 17604.0 422元 2 香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侶 東區 銅鑼灣永興街8號 4.5 12708.0 693元 3 香港碧薈酒店(The BEACON) 商務出行 油尖旺 九龍旺角洗衣街88號 4.7 328.0 747元 4 香港灣仔帝盛酒店(Dorsett Wanchai) 浪漫情侶 灣仔 皇后大道東387-397號 4.4 5014.0 693元 5 如心艾朗酒店(L‘hotel elan) 浪漫情侶 觀塘 觀塘創業街38號 4.6 3427.0 581元
四、dataframe排序
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind=‘quicksort’, na_position=‘last’, ignore_index=False, key=None) 常用引數: by:字串或者字串串列,分別單列排序或者多列排序 ascending:升序或者降序,bool型別或者bool型別的串列,與by引數相對應
df2= pd. read_excel( r'C:/Users/37957/Desktop/pandas_files/pandas_dataframe/hotel.xlsx' , index_col= '序號' )
df2. sort_values( by= [ '區域' , '評價' ] , ascending= [ True , False ] ) . head( ) # 對區域列按正序,評價按從高到低排序,查看前5行
名稱 關鍵字 區域 地址 評價 點評人數 平均消費 序號 131 香港東隅(East Hong Kong) 海濱風光 東區 太古城道29號 4.7 4549.0 1408元 40 香港頤庭酒店(銅鑼灣店)(Eco Tree Hotel Causeway Bay) NaN 東區 銅鑼灣水星街15號 4.6 15.0 567元 94 香港海匯酒店(Hotel VIC on the Harbour) 海濱風光 東區 北角邨里一號 4.6 298.0 950元 121 香港如心銅鑼灣海景酒店(L‘hotel Causeway Bay Harbour View ... 海濱風光 東區 銅鑼灣 英皇道18號 4.6 9712.0 678元 189 香港銅鑼灣維景酒店(Metropark Hotel Causeway Bay Hong Kong) 海濱風光 東區 銅鑼灣 銅鑼灣道148號 4.6 3168.0 950元