pandas-dataframe-operation

2020-09-23 14:00:17

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.617604.0422元
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.0693元
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747元
4香港灣仔帝盛酒店(Dorsett Wanchai)浪漫情侶灣仔皇后大道東387-397號4.45014.0693元
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.0581元
df.tail() #括號中不輸引數時,預設查詢後5行資料
名稱關鍵字區域地址評價點評人數平均消費
序號
416香港天天賓館(TIN TIN GUEST HOUSE)地鐵周邊油尖旺旺角彌敦道607號新興大廈1517A3.216.0227元
417香港AMR賓館(AMR Hostel)地鐵周邊NaN尖沙咀彌敦道58號美麗都大廈6字樓A12室NaNNaN977元
418香港如心海景酒店暨會議中心(L‘hotel Nina et Convention Centre)海濱風光荃灣荃灣 楊屋道8號4.545462.0709元
419香港如心海景酒店暨會議中心(L‘hotel Nina et Convention Centre)海濱風光荃灣荃灣 楊屋道8號4.545463.0709元
420香港花盈酒店(家庭旅館)(Bloomy Hotel)地鐵周邊油尖旺尖沙咀彌敦道87號華源大廈9字樓C2室4.0273.0256元
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中數值型欄位進行描述統計
評價點評人數
count371.000000404.000000
mean4.2838272483.262376
std0.5082644539.495778
min1.5000001.000000
25%4.20000087.000000
50%4.400000853.500000
75%4.6000003247.000000
max4.90000045463.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.617604.0422元
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.0693元
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747元
4香港灣仔帝盛酒店(Dorsett Wanchai)浪漫情侶灣仔皇后大道東387-397號4.45014.0693元
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.0581元

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.617604.0422元
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.0693元

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.617604.0422元
# 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.617604.0422元
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.0693元
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747元
# 5、使用條件表示式查詢
df.loc[df['評價']>=4.6,:]
名稱關鍵字區域地址評價點評人數平均消費
序號
1香港嘉湖海逸酒店(Harbour Plaza Resort City)休閒度假元朗天水圍 天恩路18號4.617604.0422元
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747元
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.0581元
# 多條件查詢
df.loc[(df['關鍵字']=='休閒度假')& (df['評價']>=4.6),:]
名稱關鍵字區域地址評價點評人數平均消費
序號
1香港嘉湖海逸酒店(Harbour Plaza Resort City)休閒度假元朗天水圍 天恩路18號4.617604.0422元

二、dataframe新增&修改資料列

1、直接賦值
2、分條件賦值
3、apply方法

# 將原dataframe中平均消費欄位的‘元’去掉
df #檢視原dataframe
名稱關鍵字區域地址評價點評人數平均消費
序號
1香港嘉湖海逸酒店(Harbour Plaza Resort City)休閒度假元朗天水圍 天恩路18號4.617604.0422元
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.0693元
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747元
4香港灣仔帝盛酒店(Dorsett Wanchai)浪漫情侶灣仔皇后大道東387-397號4.45014.0693元
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.0581元
df['平均消費']=df['平均消費'].str.replace('元','').astype('int') # 去掉‘元’
df #再次檢視dataframe
名稱關鍵字區域地址評價點評人數平均消費
序號
1香港嘉湖海逸酒店(Harbour Plaza Resort City)休閒度假元朗天水圍 天恩路18號4.617604.0422
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.0693
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747
4香港灣仔帝盛酒店(Dorsett Wanchai)浪漫情侶灣仔皇后大道東387-397號4.45014.0693
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.0581
# 直接賦值方法
df['總消費']=df['點評人數']*df['平均消費']
df
名稱關鍵字區域地址評價點評人數平均消費總消費
序號
1香港嘉湖海逸酒店(Harbour Plaza Resort City)休閒度假元朗天水圍 天恩路18號4.617604.04227428888.0
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.06938806644.0
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747245016.0
4香港灣仔帝盛酒店(Dorsett Wanchai)浪漫情侶灣仔皇后大道東387-397號4.45014.06933474702.0
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.05811991087.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.617604.04227428888.0評價中
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.06938806644.0評價低
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747245016.0評價高
4香港灣仔帝盛酒店(Dorsett Wanchai)浪漫情侶灣仔皇后大道東387-397號4.45014.06933474702.0評價低
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.05811991087.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.617604.04227428888.0評價中普通消費
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.06938806644.0評價低中等消費
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747245016.0評價高高等消費
4香港灣仔帝盛酒店(Dorsett Wanchai)浪漫情侶灣仔皇后大道東387-397號4.45014.06933474702.0評價低中等消費
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.05811991087.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.617604.0422元
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.0693元
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747元
4香港灣仔帝盛酒店(Dorsett Wanchai)浪漫情侶灣仔皇后大道東387-397號4.45014.0693元
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.0581元
df1['評價'].fillna(method='ffill',inplace=True)  # 將評價欄位的空值以前一個不為空的值填充
df1.head()  # 檢視前5行
名稱關鍵字區域地址評價點評人數平均消費
序號
1香港嘉湖海逸酒店(Harbour Plaza Resort City)休閒度假元朗天水圍 天恩路18號4.617604.0422元
2香港銅鑼灣皇悅酒店(Empire Hotel Hong Kong-Causeway Bay)浪漫情侶東區銅鑼灣永興街8號4.512708.0693元
3香港碧薈酒店(The BEACON)商務出行油尖旺九龍旺角洗衣街88號4.7328.0747元
4香港灣仔帝盛酒店(Dorsett Wanchai)浪漫情侶灣仔皇后大道東387-397號4.45014.0693元
5如心艾朗酒店(L‘hotel elan)浪漫情侶觀塘觀塘創業街38號4.63427.0581元

四、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.74549.01408元
40香港頤庭酒店(銅鑼灣店)(Eco Tree Hotel Causeway Bay)NaN東區銅鑼灣水星街15號4.615.0567元
94香港海匯酒店(Hotel VIC on the Harbour)海濱風光東區北角邨裡一號4.6298.0950元
121香港如心銅鑼灣海景酒店(L‘hotel Causeway Bay Harbour View ...海濱風光東區銅鑼灣 英皇道18號4.69712.0678元
189香港銅鑼灣維景酒店(Metropark Hotel Causeway Bay Hong Kong)海濱風光東區銅鑼灣 銅鑼灣道148號4.63168.0950元