- 先直接放源码
-
import pandas as pd
pd.set_option('display.max_rows', None)
def demo():
#********** Begin **********#
data = pd.read_csv("./step1/bournemouth_venues.csv")
data1 = data["Venue Name"]
data2= "" + data1.str.split().str.get(-1)
data3 = data2.str.replace("P.*","")
data3.drop(data3[data3.values==""].index,inplace = False)
data4 = data3.str.contains("[a-zA-Z]+")
data3.drop(data4[data4==False].index,inplace=True)
pd.set_option('display.max_rows', None)
print(data3.head(30).to_string(header=False, dtype=False))
print(" ... ")
print(data3.tail(30).to_string(header=False, dtype=False))
print("Name: Venue Name, Length: 90, dtype: object",end="")
return "";
# ********** End **********#
- 相关知识
- 编程要求
- 测试说明
任务描述
本关任务:读取step1/bournemouth_venues.csv
文件,获取Venue Name
列,通过向量化字符串操作得到清洗后的数据。
相关知识
为了完成本关任务,你需要掌握:1.pandas
字符串方法;2. 基本正则表达式。
字符串方法
如果你对Python
字符串方法十分了解,那么下面的知识对你来说如瓮中捉鳖,几乎所有的Python
内置的字符串方法都被复制到Pandas
的向量化字符串方法中。
下面列举为Pandas
字符串方法借鉴Python
字符串方法的内容:
它们的作用与Python
字符串的基本一致,但是需要注意这些方法的返回值不同。举两个例子:
- 样例
1
:
monte = pd.Series(['Graham Chapman', 'John Cleese', 'Terry Gilliam', 'Eric Idle', 'Terry Jones', 'Michael Palin'])
monte.str.lower() # 返回字符串
输出:
0 graham chapman
1 john cleese
2 terry gilliam
3 eric idle
4 terry jones
5 michael palin
dtype: object
- 样例
2
:
monte.str.split() # 返回列表
输出:
0 [Graham, Chapman]
1 [John, Cleese]
2 [Terry, Gilliam]
3 [Eric, Idle]
4 [Terry, Jones]
5 [Michael, Palin]
dtype: object
pandas
中还有一些自带的字符串方法,如下图所示:
其中get_dummies()
方法有点难以理解,给大家举个例子:假设有一个包含了某种编码信息的数据集,如 A
= 出生在美国、B
= 出生在英国、C
= 喜欢奶酪、D
= 喜欢午餐肉:
full_monte = pd.DataFrame({
'name': monte,
'info': ['B|C|D', 'B|D', 'A|C', 'B|D', 'B|C', 'B|C|D']})
print(full_monte)
输出:
info name
0 B|C|D Graham Chapman
1 B|D John Cleese
2 A|C Terry Gilliam
3 B|D Eric Idle
4 B|C Terry Jones
5 B|C|D Michael Palin
get_dummies()
方法可以让你快速将这些指标变量分割成一个独热编码的DataFrame
(每个元素都是0
或1
):
full_monte['info'].str.get_dummies('|')
输出:
A B C D
0 0 1 1 1
1 0 1 0 1
2 1 0 1 0
3 0 1 0 1
4 0 1 1 0
5 0 1 1 1
正则表达式方法
还有一些支持正则表达式的方法可以用来处理每个字符串元素。如下图所示:
众所周知,正则表达式“无所不能”,我们可以利用正则实现一些独特的操作,例如提取每个人的first name
:
monte.str.ext\fract('([A-Za-z]+)')
输出:
0 Graham
1 John
2 Terry
3 Eric
4 Terry
5 Michael
dtype: object
或者找出所有开头和结尾都是辅音字符的名字:
monte.str.findall(r'^[^AEIOU].*[^aeiou]$')
输出:
0 [Graham Chapman]
1 []
2 [Terry Gilliam]
3 []
4 [Terry Jones]
5 [Michael Palin]
dtype: object
如果你想深入了解这些方法的作用,请参考Pandas官方文档
编程要求
本关的编程任务是补全右侧上部代码编辑区内的相应代码,要求实现如下功能:
- 读取
step1/bournemouth_venues.csv
文件,文件说明如下:
列名 | 说明 |
---|---|
Venue Name | 场地名 |
Venue Category | 场地类别 |
Venue Latitude | 场地经度 |
Venue Longitude | 场地纬度 |
-
以空格切分每个场地名并获取每个切分后列表的最后一个元素作为一个
Series
; -
将所有单词为
P
开头的值替换为空,并删除所有为空的行; -
找出所有值不含字母的行并删除;
-
返回清洗后的结果;
-
具体要求请参见后续测试样例。
请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!
测试说明
平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。
测试输入:
无测试输入
预期输出:
0 Roast
1 DelMarco
2 Gardens
3 Gardens
4 Square
5 Stable
6 Starbucks
7 Co.
8 Gardens
9 Sandwich
10 Kitchen
11 Gym
12 Coffee
13 Bournemouth
14 Manger
15 Cucumber
16 Guys
17 Club
18 Beach
19 Odeon
20 Gelateria
21 Valerie
22 Greek
23 Slope)
24 Starbucks
26 Nero
28 Tealith
29 NEO
30 Bay
31 Aces
...
67 Co.
69 Garden
70 Brasserie
71 Restaurant
72 Gardens
73 Atlantico
74 Hotel
75 DYMK
76 Winchester
77 Subway
78 Circus
79 Bar
80 Triangle
81 Rojo
82 KFC
83 Hotel
84 Cliff
85 Xchange
86 Express
87 (Harvester)
88 Zag
89 (BMH)
90 Bournemouth
91 Coffee
92 Inn
93 Stop
94 Chineside
96 Hotel
97 Hotel
98 Chine
Name: Venue Name, Length: 90, dtype: object