DataFrame作为Pandas的核心数据结构其数据操作能力覆盖了从基础访问到高级分析的全场景。本文将系统梳理DataFrame的数据访问、筛选、转换、聚合和高级操作五大核心能力结合代码示例和性能优化技巧帮助读者全面掌握这一数据分析利器。一、数据访问精准定位数据的N种方式1.列访问直接索引与属性访问字典式访问通过列名直接获取Series对象importpandasaspd dfpd.DataFrame({A:[1,2],B:[x,y]})col_adf[A]# 返回Series属性访问仅限列名符合变量命名规则时col_adf.A# 等效于df[A]但列名含空格或特殊字符时会报错2.行访问标签索引与位置索引.loc[]按标签索引包含末端dfpd.DataFrame({A:[1,2,3]},index[a,b,c])print(df.loc[a:b])# 输出行a和b.iloc[]按位置索引不包含末端print(df.iloc[0:2])# 输出前两行位置0和1混合索引同时访问行和列print(df.loc[a,A])# 输出行a列A的值1print(df.iloc[0,0])# 等效操作位置索引3.条件筛选布尔索引与查询函数布尔索引通过条件表达式筛选dfpd.DataFrame({A:[1,2,3],B:[x,y,z]})resultdf[df[A]1]# 筛选A列值大于1的行.query()方法字符串形式编写条件适合复杂条件resultdf.query(A 1 and B ! z)# 筛选A1且B≠z的行4.多级索引访问Hierarchical Indexing创建多级索引DataFramearrays[[A,A,B,B],[1,2,1,2]]indexpd.MultiIndex.from_arrays(arrays,names(Letter,Number))dfpd.DataFrame({Data:[10,20,30,40]},indexindex)访问特定层级数据print(df.loc[A])# 筛选LetterA的所有行print(df.loc[(A,1)])# 精确筛选LetterA且Number1的行print(df.xs(A,levelLetter))# 使用xs方法按层级筛选二、数据修改增删改查的全流程控制1.添加数据列与行的扩展添加列df[C][True,False,True]# 直接赋值df[D]df[A]*2# 通过运算生成新列添加行使用loc扩展索引df.loc[3][4,w,False,8]# 添加新行索引为3使用append已弃用推荐pd.concatnew_rowpd.DataFrame({A:[5],B:[v]})dfpd.concat([df,new_row],ignore_indexTrue)2.删除数据列与行的移除删除列df.drop(C,axis1,inplaceTrue)# 删除列C删除行df.drop([0,2],axis0,inplaceTrue)# 删除索引为0和2的行条件删除dfdf[df[A]!2]# 删除A列值为2的行3.修改数据精准更新与批量替换单值修改df.loc[0,A]100# 修改索引0行A列的值为100批量替换df[A].replace(100,1000,inplaceTrue)# 将A列所有100替换为1000按条件替换df[A]df[A].apply(lambdax:x*2ifx1elsex)# A列值1时乘以2三、数据转换重塑与重构数据结构1.数据透视pivot与pivot_tablepivot将长格式数据转换为宽格式data{Date:[2023-01-01,2023-01-01,2023-01-02],Category:[A,B,A],Value:[10,20,30]}dfpd.DataFrame(data)pivot_dfdf.pivot(indexDate,columnsCategory,valuesValue)pivot_table支持聚合的透视表pivot_table_dfdf.pivot_table(indexDate,columnsCategory,valuesValue,aggfuncmean)2.熔化数据melt宽转长melted_dfpd.melt(pivot_df,var_nameCategory,value_nameValue)3.数据合并merge与joinmerge类似SQL的连接操作leftpd.DataFrame({Key:[A,B],Value1:[1,2]})rightpd.DataFrame({Key:[A,B],Value2:[3,4]})merged_dfpd.merge(left,right,onKey,howinner)# 内连接join基于索引的快速合并left.set_index(Key,inplaceTrue)right.set_index(Key,inplaceTrue)joined_dfleft.join(right,howleft)# 左连接4.数据排序sort_values与sort_index按值排序df.sort_values(A,ascendingFalse,inplaceTrue)# 按A列降序排序按索引排序df.sort_index(inplaceTrue)# 按行索引排序四、数据聚合分组计算与统计分析1.分组聚合groupby基础分组计算dfpd.DataFrame({Category:[A,B,A,B],Value:[10,20,30,40]})groupeddf.groupby(Category)[Value].agg([sum,mean,count])多列分组df[Subcategory][X,Y,X,Y]multi_groupeddf.groupby([Category,Subcategory])[Value].sum()2.窗口函数rolling与expanding滚动计算dfpd.DataFrame({Value:[1,2,3,4,5]})df[Rolling_Mean]df[Value].rolling(window3).mean()# 3期移动平均扩展计算df[Expanding_Sum]df[Value].expanding().sum()# 累计求和3.高级聚合transform与applytransform返回与分组大小相同的Seriesdf[Group_Mean]df.groupby(Category)[Value].transform(mean)apply自定义聚合函数defcustom_agg(x):returnx.max()-x.min()df[Value_Range]df.groupby(Category)[Value].apply(custom_agg)五、高级操作超越基础的数据处理1.时间序列处理生成时间索引datespd.date_range(2023-01-01,periods5,freqD)dfpd.DataFrame({Value:[1,2,3,4,5]},indexdates)时间重采样df.resample(W).sum()# 按周汇总2.文本处理字符串方法列级字符串操作dfpd.DataFrame({Text:[apple,banana,cherry]})df[Text_Length]df[Text].str.len()# 计算字符串长度df[Text_Upper]df[Text].str.upper()# 转换为大写3.分类数据astype(category)转换为分类类型df[Category]df[Category].astype(category)获取分类信息print(df[Category].cat.categories)# 输出所有类别print(df[Category].cat.codes)# 输出类别编码4.性能优化技巧使用categorical减少内存df[Category]df[Category].astype(category)# 尤其适合低基数列避免链式操作# 不推荐可能引发SettingWithCopyWarningdf[df[A]1][B]0# 推荐maskdf[A]1df.loc[mask,B]0使用eval加速计算适合大型DataFramedf.eval(C A * B,inplaceTrue)# 比直接赋值更快六、总结DataFrame操作的核心原则向量化优先尽量避免逐行循环优先使用Pandas内置的向量化操作。链式操作谨慎复杂的链式操作可能引发警告或错误建议拆分为多步。内存效率对大型数据集优先使用categorical类型和chunksize分块处理。索引设计合理设计索引如时间索引、多级索引可显著提升查询效率。掌握这些操作后DataFrame将不再仅仅是数据容器而是能高效完成数据清洗、转换、分析和可视化的全能工具。无论是处理百万级数据集还是复杂分析场景DataFrame都能通过简洁的语法实现强大的功能。