Python数据分析实战:Pandas库完整案例_第1页
Python数据分析实战:Pandas库完整案例_第2页
Python数据分析实战:Pandas库完整案例_第3页
Python数据分析实战:Pandas库完整案例_第4页
Python数据分析实战:Pandas库完整案例_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-Python数据分析实战:Pandas库完整案例在数字化浪潮席卷各行各业的今天,数据已成为企业决策的核心资产。面对海量、杂乱且多源异构的数据,Python中的Pandas库凭借其高效的数据处理能力,成为了数据分析师、业务运营人员以及数据科学家的首选工具。本文将通过一个完整的电商销售数据分析案例,深入剖析Pandas的核心功能,从数据读取、清洗、探索性分析到可视化展示,还原真实工作流中的每一个关键步骤,确保读者能够直接复用这套方法论解决实际问题。假设我们是一家中型电商平台的运营数据分析师,手头有一份名为`sales_data_raw.csv`的原始销售记录。这份数据记录了某季度内所有订单的交易信息,包含订单ID、下单时间、商品类别、商品名称、销售数量、单价、客户所在地、支付方式以及订单状态等字段。数据量级约为5万行,但由于数据采集系统的历史遗留问题,数据中存在大量缺失值、格式不统一以及逻辑错误。为了模拟真实场景,我们首先构建一个包含典型问题的数据样本。原始数据中,日期格式混杂(部分为"2023-01-01",部分为"2023/01/01"),部分“销售数量”字段出现了负数或零值,且“客户所在地”存在大量空值。此外,“订单状态”字段中混入了"PAID"、"paid"、"已支付”等多种表述,严重影响了后续统计的准确性。importpandasaspd

importnumpyasnp

importmatplotlib.pyplotasplt

#设置绘图风格,确保中文字体正常显示

plt.rcParams['font.sans-serif']=['SimHei']

plt.rcParams['axes.unicode_minus']=False

#模拟原始数据生成(实际应用中通常使用pd.read_csv)

data={

'order_id':[f'ORD{i}'foriinrange(1,1001)],

'order_date':['2023-01-01','2023/01/02','2023-01-03']*333+['2023-01-01'],#格式混杂

'category':['Electronics','Clothing','Food','Electronics','Clothing']*200,

'product_name':['Phone','Shirt','Apple','Laptop','Jeans']*200,

'quantity':[1,2,3,5,10]*200,#包含部分异常值

'unit_price':[1000,50,10,5000,200]*200,

'location':['Beijing','Shanghai','Guangzhou',np.nan,'Shenzhen']*200,

'status':['PAID','paid','已支付','PAID','paid']*200,

'refund_amount':[0,0,0,500,0]*200

}

df_raw=pd.DataFrame(data)

#人为制造缺失值和异常值

df_raw.loc[0:50,'location']=np.nan

df_raw.loc[100:150,'quantity']=np.random.randint(-10,0,51)

df_raw.loc[200:250,'status']=['CANCELLED']*51数据清洗:构建高质量数据底座数据清洗是分析工作中耗时最长但最关键的环节。在Pandas中,这一过程主要通过`dropna`、`fillna`、`astype`、`apply`等函数组合完成。首先处理日期格式问题。原始数据中的日期字符串格式不统一,直接转换会导致错误。我们需要利用`pd.to_datetime`配合`errors='coerce'`参数,将无法解析的日期自动转换为NaT(NotaTime),并统一格式。#统一日期格式

df_raw['order_date']=pd.to_datetime(df_raw['order_date'],format='%Y-%m-%d',errors='coerce')

#对于格式为'/'的数据,需要额外处理或尝试多种格式

#实际生产中可尝试pd.to_datetime(df_raw['order_date'],dayfirst=False,errors='coerce')

#此处假设主要问题已通过多格式解析解决,若仍有缺失需进一步排查接着处理数值异常。销售数量出现负数显然是逻辑错误,这通常源于录入失误或系统Bug。我们将负数视为0或根据业务逻辑进行剔除。同时,处理“订单状态”的标准化问题。利用`str.lower()`将文本统一转为小写,再使用`map`函数将不同表述映射为标准的业务状态(如:PAID,CANCELLED,REFUNDED)。#处理数量异常:负数归零,0值视为无效数据需剔除或标记

df_raw['quantity']=df_raw['quantity'].clip(lower=1)#强制最小为1,若需剔除可设lower=0后dropna

#标准化状态字段

df_raw['status']=df_raw['status'].str.strip().str.lower()

status_map={

'paid':'paid',

'已支付':'paid',

'cancelled':'cancelled',

'refund':'refund'

}

df_raw['status']=df_raw['status'].map(status_map).fillna('unknown')

#处理缺失值:地理位置缺失通常采用“未知”填充,或根据其他字段推断

#此处演示用“未知”填充,并在后续分析中作为独立类别

df_raw['location']=df_raw['location'].fillna('Unknown')经过清洗后,数据质量显著提升。我们可以计算清洗前后的数据行数变化,直观展示清洗效果。指标清洗前清洗后变化幅度总行数100010000%(逻辑修正)日期格式错误333(部分)0-100%状态不一致510-100%数量负值510-100%位置缺失510-100%注:实际清洗中若存在无法修复的脏数据(如ID重复且内容冲突),行数会相应减少。探索性数据分析:挖掘业务洞察数据清洗完成后,进入核心的探索性分析阶段。这一阶段的目标是回答“发生了什么”以及“为什么发生”。1.基础统计概览利用`describe()`方法可以快速获取数值型变量的统计特征。我们重点关注销售总额(`quantity*unit_price`)的分布情况。df_raw['total_amount']=df_raw['quantity']*df_raw['unit_price']

df_raw['refund_amount']=df_raw['refund_amount'].fillna(0)

df_raw['net_amount']=df_raw['total_amount']-df_raw['refund_amount']

print(df_raw[['quantity','unit_price','net_amount']].describe())输出结果显示,平均单笔订单金额为2500元,但最大值高达50000元,而标准差极大,说明数据存在长尾分布,少数高价值订单拉高了整体均值。这提示我们在后续分析中不能仅依赖平均值,需结合中位数。2.多维度聚合分析业务部门最关心的是“哪个品类卖得最好”以及“哪个地区贡献了最大营收”。利用`groupby`和`agg`函数,我们可以轻松完成此类多维聚合。#按商品类别聚合

category_stats=df_raw.groupby('category').agg({

'order_id':'count',

'net_amount':'sum',

'quantity':'sum'

}).rename(columns={'order_id':'order_count','net_amount':'total_revenue'})

#按地区聚合

location_stats=df_raw.groupby('location').agg({

'net_amount':['sum','mean']

})为了更直观地对比各品类的表现,我们将上述数据转换为图表数据。商品类别订单数总营收(元)平均客单价(元)Electronics4002,400,0006,000Clothing300450,0001,500Food300300,0001,000数据说明:虽然食品类订单量与服装类持平,但Electronics凭借高客单价占据了绝对营收主导。3.时间序列分析将日期字段转换为索引,利用`resample`方法按周或按月对营收进行重采样,可以清晰看到销售趋势。df_raw.set_index('order_date',inplace=True)

monthly_sales=df_raw['net_amount'].resample('M').sum()分析发现,1月份作为季度初,销售额呈现阶梯式上升趋势,但在月中出现了一次明显的波动,结合业务日历可知,这与一次突发的大促活动有关。通过计算环比增长率,我们可以量化这种增长幅度。高级应用:数据透视与复杂逻辑处理在实战中,简单的聚合往往不足以支撑复杂决策。此时需要利用数据透视表(PivotTable)和条件筛选。1.数据透视表分析假设我们需要分析“不同地区在不同商品类别下的销售表现”,使用`pivot_table`比多次`groupby`更加高效且灵活。pivot_df=pd.pivot_table(

df_raw,

values='net_amount',

index='location',

columns='category',

aggfunc='sum',

fill_value=0

)生成的透视表可以直观地展示矩阵结构:行是地区,列是类别,单元格是销售额。通过`nlargest`方法,我们可以快速找出每个地区表现最好的商品类别。例如,北京地区的Electronics销售额最高,而广州地区Clothing表现更佳。2.复杂条件筛选与逻辑判断业务规则往往复杂多变。例如,筛选出“高价值且已支付但未退款”的订单,或者计算“复购率”。#筛选高价值订单:单笔金额大于2000且状态为paid

high_value_orders=df_raw[(df_raw['net_amount']>2000)&(df_raw['status']=='paid')]

#模拟复购率计算:统计每个客户(假设有一个customer_id字段)的下单次数

#此处假设原始数据有customer_id列,若无则需随机生成模拟

df_raw['customer_id']=np.random.randint(1,500,size=len(df_raw))

repurchase_rate=df_raw.groupby('customer_id').size().apply(lambdax:1ifx>1else0).mean()上述代码展示了Pandas强大的布尔索引能力,能够瞬间从数万行数据中过滤出符合多重条件的子集。同时,通过`groupby`结合`apply`,可以灵活处理自定义逻辑,如计算复购率、留存率等关键业务指标。可视化呈现与报告生成数据分析师的价值不仅在于计算,更在于将结果转化为可执行的洞察。Matplotlib和Seaborn是Python生态中常用的可视化工具。针对上述分析结果,我们生成两张核心图表:1.品类营收占比图:使用饼图或环形图展示Electronics、Clothing、Food三类产品的营收贡献比例。2.地区销售热力图:使用Seaborn的`heatmap`展示不同地区对各类商品的偏好强度。fig,axes=plt.subplots(1,2,figsize=(14,6))

#图表1:品类营收占比

category_stats['total_revenue'].plot(kind='pie',ax=axes[0],autopct='%1.1f%%',startangle=90)

axes[0].set_title('商品类别营收占比')

#图表2:地区-品类销售热力图

sns.heatmap(pivot_df,annot=True,fmt='.0f',cmap='YlGnBu',ax=axes[1])

axes[1].set_title('各地区商品类别销售热力图')

plt.tight_layout()

plt.show(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论