Common operations of pandas-dataframe
The previous article shared pandas data reading. In this section, we continue to share common operations after reading data to obtain a dataframe
import pandas as pd
One, dataframe query
1. View the first few rows, next few rows, row and column information of the dataframe, and perform descriptive statistics on numeric field data
df=pd.read_excel(r'C:/Users/37957/Desktop/pandas_files/pandas_dataframe/hotel.xlsx',index_col='序号')
df.head()
|
name |
Keyword |
area |
address |
Evaluation |
Number of reviews |
Average consumption |
Serial number |
|
|
|
|
|
|
|
1 |
Harbour Plaza Resort City, Hong Kong |
Leisure vacation |
Yuen Long |
18 Tin Yan Road, Tin Shui Wai |
4.6 |
17604.0 |
422 yuan |
2 |
Empire Hotel Hong Kong-Causeway Bay (Empire Hotel Hong Kong-Causeway Bay) |
Romantic couple |
East District |
8 Wing Hing Street, Causeway Bay |
4.5 |
12708.0 |
693 yuan |
3 |
The BEACON Hong Kong |
Business travel |
Yau Tsim Mong |
88 Sai Yee Street, Mong Kok, Kowloon |
4.7 |
328.0 |
747 yuan |
4 |
Dorsett Wanchai, Hong Kong |
Romantic couple |
Wanchai |
387-397 Queen's Road East |
4.4 |
5014.0 |
693 yuan |
5 |
L'hotel elan |
Romantic couple |
Kwun Tong |
38 Chong Yip Street, Kwun Tong |
4.6 |
3427.0 |
581 yuan |
df.tail()
|
name |
Keyword |
area |
address |
Evaluation |
Number of reviews |
Average consumption |
Serial number |
|
|
|
|
|
|
|
416 |
Hong Kong Tiantian Hotel (TIN TIN GUEST HOUSE) |
Around the subway |
Yau Tsim Mong |
1517A, Sun Hing Building, 607 Nathan Road, Mong Kok |
3.2 |
16.0 |
227 yuan |
417 |
AMR Hostel Hong Kong |
Around the subway |
NaN |
Room A12, 6th Floor, Mirador Mansion, 58 Nathan Road, Tsim Sha Tsui |
NaN |
NaN |
977 yuan |
418 |
Hong Kong L'hotel Nina et Convention Centre |
Seaside scenery |
Tsuen Wan |
8 Yeung Uk Road, Tsuen Wan |
4.5 |
45462.0 |
709 yuan |
419 |
Hong Kong L'hotel Nina et Convention Centre |
Seaside scenery |
Tsuen Wan |
8 Yeung Uk Road, Tsuen Wan |
4.5 |
45463.0 |
709 yuan |
420 |
Hong Kong Bloomy Hotel (Family Hotel) (Bloomy Hotel) |
Around the subway |
Yau Tsim Mong |
Room C2, 9th Floor, Hua Yuan Building, 87 Nathan Road, Tsim Sha Tsui |
4.0 |
273.0 |
256 yuan |
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()
|
Evaluation |
Number of reviews |
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]
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['名称']
<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[['名称','平均消费']]
<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、使用条件表达式查询
df.loc[1,'名称']
'香港嘉湖海逸酒店(Harbour Plaza Resort City)'
df.loc[1]
名称 香港嘉湖海逸酒店(Harbour Plaza Resort City)
关键字 休闲度假
区域 元朗
地址 天水围 天恩路18号
评价 4.6
点评人数 17604
平均消费 422元
Name: 1, dtype: object
df.loc[[1]]
|
名称 |
关键字 |
区域 |
地址 |
评价 |
点评人数 |
平均消费 |
序号 |
|
|
|
|
|
|
|
1 |
香港嘉湖海逸酒店(Harbour Plaza Resort City) |
休闲度假 |
元朗 |
天水围 天恩路18号 |
4.6 |
17604.0 |
422元 |
df.loc[[1,2,3],['名称','平均消费']]
|
名称 |
平均消费 |
序号 |
|
|
1 |
香港嘉湖海逸酒店(Harbour Plaza Resort City) |
422元 |
2 |
香港铜锣湾皇悦酒店(Empire Hotel Hong Kong-Causeway Bay) |
693元 |
3 |
香港碧荟酒店(The BEACON) |
747元 |
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元 |
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方法
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元 |
df['平均消费']=df['平均消费'].str.replace('元','').astype('int')
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 |
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 |
评价中 |
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='序号')
df1.fillna({
'评价':0}).head()
|
名称 |
关键字 |
区域 |
地址 |
评价 |
点评人数 |
平均消费 |
序号 |
|
|
|
|
|
|
|
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()
|
名称 |
关键字 |
区域 |
地址 |
评价 |
点评人数 |
平均消费 |
序号 |
|
|
|
|
|
|
|
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()
|
名称 |
关键字 |
区域 |
地址 |
评价 |
点评人数 |
平均消费 |
序号 |
|
|
|
|
|
|
|
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元 |