10. 当两个或多个值存储于一个单元格时进行清理

  1. # 读取texas_cities数据集
  2. In[75]: cities = pd.read_csv('data/texas_cities.csv')
  3. cities
  4. out[75]:

10. 当两个或多个值存储于一个单元格时进行清理 - 图1

  1. # 将Geolocation分解为四个单独的列
  2. In[76]: geolocations = cities.Geolocation.str.split(pat='. ', expand=True)
  3. geolocations.columns = ['latitude', 'latitude direction', 'longitude', 'longitude direction']
  4. geolocations
  5. out[76]:

10. 当两个或多个值存储于一个单元格时进行清理 - 图2

  1. # 转变数据类型
  2. In[77]: geolocations = geolocations.astype({'latitude':'float', 'longitude':'float'})
  3. geolocations.dtypes
  4. out[77]: latitude float64
  5. latitude direction object
  6. longitude float64
  7. longitude direction object
  8. dtype: object
  1. # 将新列与原先的city列连起来
  2. In[78]: cities_tidy = pd.concat([cities['City'], geolocations], axis='columns')
  3. cities_tidy
  4. out[78]:

10. 当两个或多个值存储于一个单元格时进行清理 - 图3

  1. # 忽略,作者这里是写重复了
  2. In[79]: pd.concat([cities['City'], geolocations], axis='columns')
  3. out[79]:

10. 当两个或多个值存储于一个单元格时进行清理 - 图4

原理

  1. # 函数to_numeric可以将每列自动变为整数或浮点数
  2. In[80]: temp = geolocations.apply(pd.to_numeric, errors='ignore')
  3. temp
  4. out[80]:

10. 当两个或多个值存储于一个单元格时进行清理 - 图5

  1. # 再查看数据类型
  2. In[81]: temp.dtypes
  3. out[81]: latitude float64
  4. latitude direction object
  5. longitude float64
  6. longitude direction object
  7. dtype: object

更多

  1. # |符,可以对多个标记进行分割
  2. In[82]: cities.Geolocation.str.split(pat='° |, ', expand=True)
  3. out[82]:

10. 当两个或多个值存储于一个单元格时进行清理 - 图6

  1. # 更复杂的提取方式
  2. In[83]: cities.Geolocation.str.extract('([0-9.]+). (N|S), ([0-9.]+). (E|W)', expand=True)
  3. out[83]:

10. 当两个或多个值存储于一个单元格时进行清理 - 图7