10. 当两个或多个值存储于一个单元格时进行清理
# 读取texas_cities数据集
In[75]: cities = pd.read_csv('data/texas_cities.csv')
cities
out[75]:
# 将Geolocation分解为四个单独的列
In[76]: geolocations = cities.Geolocation.str.split(pat='. ', expand=True)
geolocations.columns = ['latitude', 'latitude direction', 'longitude', 'longitude direction']
geolocations
out[76]:
# 转变数据类型
In[77]: geolocations = geolocations.astype({'latitude':'float', 'longitude':'float'})
geolocations.dtypes
out[77]: latitude float64
latitude direction object
longitude float64
longitude direction object
dtype: object
# 将新列与原先的city列连起来
In[78]: cities_tidy = pd.concat([cities['City'], geolocations], axis='columns')
cities_tidy
out[78]:
# 忽略,作者这里是写重复了
In[79]: pd.concat([cities['City'], geolocations], axis='columns')
out[79]:
原理
# 函数to_numeric可以将每列自动变为整数或浮点数
In[80]: temp = geolocations.apply(pd.to_numeric, errors='ignore')
temp
out[80]:
# 再查看数据类型
In[81]: temp.dtypes
out[81]: latitude float64
latitude direction object
longitude float64
longitude direction object
dtype: object
更多
# |符,可以对多个标记进行分割
In[82]: cities.Geolocation.str.split(pat='° |, ', expand=True)
out[82]:
# 更复杂的提取方式
In[83]: cities.Geolocation.str.extract('([0-9.]+). (N|S), ([0-9.]+). (E|W)', expand=True)
out[83]: