Pandas数据分析-Task9
记录DataWhale的Pandas数据分析的学习过程,使用的教材为 joyful-pandas。
Task6是pandas的文本数据处理,内容基本可以分为四个部分,第一部分介绍str对象的基本概念;第二部分正则表达式的基础;第三部分文本处理的5个基本操作;第四部分介绍str对象的常用函数。本篇文章中所有的代码示例中用到的原始文件都可以在 此链接中下载。
思维导图
练习1
我们首先看看数据中有没有缺失:
df = pd.read_excel('data/house_info.xls', usecols=[ 'floor','year','area','price'])
df.isna().sum()
>>>
>floor 349
year 18718
area 0
price 0
可以看出,floor列和year这两列都有缺失。
1 .思路:year这一列是字符串数据类型,要使用整数年份存储则需要从字符串中提取除年份,可以用提取函数str.extract(正则表达式)。
df['year']=df.year.str.extract('(\d+)')
>>>
> floor year area price
0 高层(共6层) 1986 58.23㎡ 155万
1 中层(共20层) 2020 88㎡ 155万
2 低层(共28层) 2010 89.33㎡ 365万
3 低层(共20层) 2014 82㎡ 308万
4 高层(共1层) 2015 98㎡ 117万
2 . 思路:同样还是用提取函数str.extract(正则表达式)从原始的floor列中提取出类别和层数信息,关键在于正则表达式的写法。
df[['Level','Highest']]=df.floor.str.extract('(.层)(共(\d+)层)')
df=df[['year','area','price','Level','Highest']]
>>>
> year area price Level Highest
0 1986 58.23㎡ 155万 高层 6
1 2020 88㎡ 155万 中层 20
2 2010 89.33㎡ 365万 低层 28
3 2014 82㎡ 308万 低层 20
4 2015 98㎡ 117万 高层 1
3 .思路:用price列除area列,但是price和area列不是数值型的,需要从price和area列中提取出数值再除,即可得到结果。
price_te=df.price.str.extract('(\d+)万')[0]
area_te=df.area.str.extract('(.+)㎡')[0]
df['avg_price']=(pd.to_numeric(price_te)/pd.to_numeric(area_te)*10000).astype('string').str.extract('(\w+).\w+')[0]+' 元/平米'
>>>
> year area price Level Highest avg_price
0 1986 58.23㎡ 155万 高层 6 26618 元/平米
1 2020 88㎡ 155万 中层 20 17613 元/平米
2 2010 89.33㎡ 365万 低层 28 40859 元/平米
3 2014 82㎡ 308万 低层 20 37560 元/平米
4 2015 98㎡ 117万 高层 1 11938 元/平米
练习2
同样先看一下缺失情况:
df = pd.read_csv('data/script.csv')
df.isna().sum()
>>>
>Release Date 0
Season 0
Episode 0
Episode Title 0
Name 3
Sentence 0
可以看出,只有Name这一列有缺失,同时列名字符串前后有空格。
1 .根据Episode和Season分组即可,这里需要注意的是Season列名有空格,需要先对列名去除空格。
df.columns=df.columns.str.strip() #去空格
df.groupby(['Season','Episode'])['Sentence'].count()
>>>
>Season Episode
Season 1 Episode 1 327
Episode 10 266
Episode 2 283
Episode 3 353
Episode 4 404
2 .用空格分割字符串,需要使用str.split()函数,统计字符串长度,可以用str.len()函数。
df['sentence_num']=df.Sentence.str.split(' ').str.len()#增加一个新列:sentence_num
df.groupby('Name')['sentence_num'].mean().sort_values(ascending=False)[0:5]
>>>
>Name
male singer 109.000000
slave owner 77.000000
manderly 62.000000
lollys stokeworth 62.000000
dothraki matron 56.666667
3 .与第二问的思路基本相同,利用str.split()函数分割字符串,在利用str.len()求每个字符串中的长度,然后index+1后与原表合并。
temp=df.Sentence.str.split('?').str.len()-1
temp.index=temp.index+1
df['ans_num']=temp
df[['Name','ans_num']].groupby('Name')['ans_num'].sum().sort_values(ascending=False)[0:5]
>>>
>Name
tyrion lannister 527.0
jon snow 374.0
jaime lannister 283.0
arya stark 265.0
cersei lannister 246.0