Python 数据分析实战:POS 数据与地理位置数据的清洗合并
一、 场景引入与数据准备
二、 数据读取与初步观察
三、 数据清洗
1. 数据类型转换
2. 缺失值处理
3. 重复数据处理
四、 数据合并
五、 地理编码与 GeoDataFrame
六、 总结与展望
“喂,小王啊,跟你说个事,最近咱们得好好捋捋 POS 数据和地理位置信息这块儿。你知道的,现在数据就是金钱,把这些数据用好了,能给咱们带来不少好处。”
作为一名数据分析师,经常会遇到各种各样的数据处理需求,其中 POS 数据与地理位置数据的结合分析,在零售、餐饮、物流等行业有着广泛的应用。今天咱们就来聊聊,如何利用 Python 中的 pandas 和 geopandas 库,对 POS 数据和地理位置数据进行清洗、合并,为后续的分析挖掘打下坚实的基础。
一、 场景引入与数据准备
假设我们是一家连锁餐饮企业的数据分析师, 手头上有两份数据:
POS 数据 (pos_data.csv):记录了每个门店的销售数据,包括订单 ID、门店 ID、销售时间、销售金额等。
订单ID 门店ID 销售时间 销售金额 1001 S001 2023-10-26 10:00:00 120 1002 S002 2023-10-26 10:15:00 85 1003 S001 2023-10-26 10:30:00 200 ... ... ... ... 门店地理位置数据 (store_location.csv):记录了每个门店的地理位置信息,包括门店 ID、门店名称、经度、纬度等。
门店ID 门店名称 经度 纬度 S001 A店 116.4074 39.9042 S002 B店 116.4178 39.9145 S003 C店 116.4282 39.9248 ... ... ... ...
我们的目标是:将这两份数据根据“门店ID”进行合并,得到一份包含门店销售数据和地理位置信息的完整数据,并进行初步的清洗,为后续的分析做准备。
二、 数据读取与初步观察
首先,我们需要导入 pandas 和 geopandas 库,并读取数据。
import pandas as pd import geopandas as gpd # 读取 POS 数据 pos_data = pd.read_csv('pos_data.csv') # 读取门店地理位置数据 store_location = pd.read_csv('store_location.csv') # 查看 POS 数据的前几行 print(pos_data.head()) # 查看门店地理位置数据的前几行 print(store_location.head())
通过 head()
方法,我们可以快速查看数据的前几行,对数据的结构和内容有一个初步的了解。 此外,还可以通过 info()
方法查看数据的类型、缺失值等信息,通过describe()
查看数据的统计信息。
print(pos_data.info()) print(store_location.info()) print(pos_data.describe()) print(store_location.describe())
三、 数据清洗
数据清洗是数据分析中非常重要的一步,它直接影响到后续分析结果的准确性。常见的数据清洗操作包括:
1. 数据类型转换
通常,POS 数据中的“销售时间”列是字符串类型,我们需要将其转换为 pandas 中的 datetime 类型,方便后续的时间序列分析。
pos_data['销售时间'] = pd.to_datetime(pos_data['销售时间']) print(pos_data.info())
2. 缺失值处理
在实际数据中,经常会遇到缺失值的情况。我们需要根据具体情况,选择合适的处理方法。
- 查找缺失值:
# 查看 POS 数据中的缺失值情况 print(pos_data.isnull().sum()) # 查看门店地理位置数据中的缺失值情况 print(store_location.isnull().sum())
处理缺失值:
删除: 如果缺失值的数量较少,且对整体数据影响不大,可以直接删除包含缺失值的行。
# 删除 pos_data 中包含缺失值的行 pos_data = pos_data.dropna() 填充: 如果缺失值的数量较多,或者缺失值所在的列比较重要,可以考虑使用填充的方法。
# 使用平均值填充 pos_data 中“销售金额”列的缺失值 pos_data['销售金额'] = pos_data['销售金额'].fillna(pos_data['销售金额'].mean()) # 使用 “未知” 填充 store_location 中“门店名称”列的缺失值 store_location['门店名称'] = store_location['门店名称'].fillna('未知') 常用的填充值包括:平均值、中位数、众数、特定值等。
3. 重复数据处理
重复数据可能会导致分析结果出现偏差,需要进行处理。
- 查找重复值
# 检查 pos_data 中是否存在完全重复的行 print(pos_data.duplicated().sum()) #检查指定列 print(pos_data.duplicated(subset=['订单ID']).sum())
- 删除重复值:
# 删除 pos_data 中完全重复的行 pos_data = pos_data.drop_duplicates() # 删除指定列重复项,保留第一个 pos_data = pos_data.drop_duplicates(subset=['订单ID'], keep='first')
四、 数据合并
数据清洗完成后,我们需要将 POS 数据和门店地理位置数据根据“门店ID”进行合并。
# 使用 merge() 方法进行合并,指定连接键为“门店ID” merged_data = pd.merge(pos_data, store_location, on='门店ID') # 查看合并后的数据 print(merged_data.head())
pd.merge()
是 pandas 中非常强大的数据合并函数,类似于 SQL 中的 JOIN 操作。on='门店ID'
指定了连接键,表示根据“门店ID”列进行合并。 默认是内连接(inner join),只保留两个数据框中都存在的“门店ID”的行。 还可以通过 how
参数指定连接方式:
how='left'
:左连接,保留左侧数据框(pos_data)中的所有行。how='right'
:右连接,保留右侧数据框(store_location)中的所有行。how='outer'
:外连接,保留两个数据框中的所有行。
五、 地理编码与 GeoDataFrame
如果我们的门店地理位置数据中没有经纬度信息,只有地址信息,那么就需要进行地理编码。
地理编码: 将地址信息转换为经纬度坐标的过程。
逆地理编码: 将经纬度坐标转换为地址信息的过程。
我们可以使用 geopandas 提供的 geocode()
函数进行地理编码。 首次使用需要安装geopy。
pip install geopy
from geopy.geocoders import Nominatim # 创建 Nominatim 地理编码器 geolocator = Nominatim(user_agent='my-geo-app') # user_agent 随便填一个名字 # 假设 store_location 数据中有一个“地址”列 # store_location['地址'] = store_location['门店名称'] + '详细地址' # 对“地址”列进行地理编码,得到经纬度信息, apply()对每一行执行操作 def get_location(address): try: location = geolocator.geocode(address) if location: return location.latitude, location.longitude else: return None, None except: return None,None # store_location[['纬度', '经度']] = store_location['地址'].apply(get_location).tolist() #如果有地址列 # 如果没有地址,可以尝试字符串拼接
得到经纬度信息后,我们可以将 pandas 的 DataFrame 转换为 geopandas 的 GeoDataFrame,方便后续的空间数据分析。
# 将 merged_data 转换为 GeoDataFrame geo_data = gpd.GeoDataFrame(merged_data, geometry=gpd.points_from_xy(merged_data.经度, merged_data.纬度)) # 设置坐标参考系(CRS),通常使用 WGS 84 坐标系,对应的 EPSG 代码为 4326 geo_data.crs = 'EPSG:4326' # 查看 GeoDataFrame print(geo_data.head())
六、 总结与展望
本文介绍了如何使用 Python 的 pandas 和 geopandas 库对 POS 数据和地理位置数据进行清洗、合并和地理编码。 通过这些操作,我们可以将原本分散的数据整合起来,为后续的空间数据分析、可视化以及更深入的业务洞察打下基础。
“小王啊,你看,通过这些步骤,咱们就把数据给捋顺了。接下来,就可以利用这些数据,分析各个门店的销售情况、客流量分布、周边竞争情况等等,为咱们的经营决策提供支持。数据分析这块儿,大有可为啊!”
后续可进行的操作包括但不限于:
- 空间可视化: 使用 geopandas 的
plot()
方法,将门店位置在地图上进行可视化。 - 空间查询: 查询某个区域内的门店信息。
- 缓冲区分析: 分析门店周边一定范围内的客户分布情况。
- 核密度估计: 分析门店的聚集程度。
- 空间关联分析: 分析门店销售额与周边环境因素(如人口密度、竞争对手数量等)的关系。
- 结合时间序列分析: 分析销售额随时间变化及与地理位置的关系
数据分析是一个不断迭代、不断深入的过程。 希望本文能为你提供一个入门的指引,帮助你更好地利用 Python 进行数据分析,挖掘数据背后的价值。