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元 |