Pandas数据分析-Task9

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.231551  中层(共20层)  2020     881552  低层(共28层)  2010  89.333653  低层(共20层)  2014     823084   高层(共1层)  2015     98117

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.23155万    高层       6
1  2020     88155万    中层      20
2  2010  89.33365万    低层      28
3  2014     82308万    低层      20
4  2015     98117万    高层       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.23155万    高层       6  26618/平米
1  2020     88155万    中层      20  17613/平米
2  2010  89.33365万    低层      28  40859/平米
3  2014     82308万    低层      20  37560/平米
4  2015     98117万    高层       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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值