找回密码
 会员注册
查看: 24|回复: 0

Python进阶入门之DataFrame

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-9 23:20:31 | 显示全部楼层 |阅读模式
引言接上一篇《关于Python中的series详解与应用》。本篇将详细介绍DataFrame,主要包括它的定义、创建方法、常用操作、应用场景以及与其他数据结构的比较。什么是DataFrameDataFrame是Pandas库中的一种二维标签数据结构,可以看作是一种带有行和列标签的表格数据。它既有行索引,也有列索引,每列可以是不同的数据类型。DataFrame类似于电子表格或SQL表格,非常适合用于数据分析和处理。创建DataFrame可以通过多种方式创建DataFrame,常见的方法包括使用字典、列表、Numpy数组或读取文件。importpandasaspdimportnumpyasnp#使用字典创建DataFramedata={'Name':['Alice','Bob','Charlie'],'Age':[25,30,35],'Salary':[50000,60000,70000]}df1=pd.DataFrame(data)print(df1)print("*"*20,"分隔符","*"*20)#使用列表创建DataFramedata=[['Alice',25,50000],['Bob',30,60000],['Charlie',35,70000]]df2=pd.DataFrame(data,columns=['Name','Age','Salary'])print(df2)print("*"*20,"分隔符","*"*20)#使用Numpy数组创建DataFramedata=np.array([['Alice',25,50000],['Bob',30,60000],['Charlie',35,70000]])df3=pd.DataFrame(data,columns=['Name','Age','Salary'])print(df3)print("*"*20,"分隔符","*"*20)#读取CSV文件创建DataFrame#df4=pd.read_csv('data.csv')#读者自行选择文件读取#print(df4) 上述代码运行结果如下:NameAgeSalary0Alice25500001Bob30600002Charlie3570000********************分隔符********************NameAgeSalary0Alice25500001Bob30600002Charlie3570000********************分隔符********************NameAgeSalary0Alice25500001Bob30600002Charlie3570000DataFrame的常用操作访问和修改数据可以通过行标签和列标签访问和修改DataFrame中的数据。#访问数据print(df1['Name'])#访问单列print(df1[['Name','Age']])#访问多列print(df1.loc[0])#loc使用行和列的标签来进行访问。例如,df1.loc[0]表示访问标签为0的那一行print("*"*20,"分隔符","*"*20)print(df1.iloc[0])#iloc使用行和列的整数位置来进行访问。例如,df1.iloc[0]表示访问第0行(第一行)print("*"*20,"分隔符","*"*20)#修改数据df1.at[0,'Age']=26#将索引为0的那一行年龄更改为26df1.loc[1,'Salary']=65000#将索引为1的那一行工资更改为65000print(df1) 上述代码运行结果为:0Alice1Bob2CharlieName:Name,dtypebjectNameAge0Alice251Bob302Charlie35NameAliceAge25Salary50000Name:0,dtypebjectNameAliceAge25Salary50000Name:0,dtypebject********************分隔符********************NameAgeSalary0Alice26500001Bob30650002Charlie3570000添加和删除数据可以轻松地添加和删除行或列。#添加列df1['Bonus']=[5000,6000,7000]print(df1)print("*"*20,"分隔符","*"*20)#删除列df1.drop('Bonus',axis=1,inplace=True)print(df1)print("*"*20,"分隔符","*"*20)#添加行new_row=pd.Series(['David',40,80000],index=['Name','Age','Salary'])df1=df1.append(new_row,ignore_index=True)#在Pandas1.4.0及更高版本中,DataFrame.append()方法已被弃用df1=pd.concat([df1,new_row.to_frame().T],ignore_index=True)print(df1)print("*"*20,"分隔符","*"*20)#删除行df1.drop(3,axis=0,inplace=True)print(df1)上述代码运行结果如下:NameAgeSalaryBonus0Alice255000050001Bob306000060002Charlie35700007000********************分隔符********************NameAgeSalary0Alice25500001Bob30600002Charlie3570000********************分隔符********************NameAgeSalary0Alice25500001Bob30600002Charlie35700003David4080000********************分隔符********************NameAgeSalary0Alice25500001Bob30600002Charlie3570000关于有关参数解释:axisaxis参数用于指定要删除的是行还是列:axis=0:表示沿行方向操作,即删除行。行索引在0轴上,因此设置axis=0。axis=1:表示沿列方向操作,即删除列。列索引在1轴上,因此设置axis=1。示例:#删除行索引为3的行df1.drop(3,axis=0,inplace=True)#删除列名为'Bonus'的列df1.drop('Bonus',axis=1,inplace=True)inplaceinplace参数用于指定操作是否在原DataFrame上进行修改。如果设置为True,则会直接修改原DataFrame;如果设置为False(默认值),则会返回一个新的DataFrame,原DataFrame保持不变。示例:#在原DataFrame上删除行索引为3的行df1.drop(3,axis=0,inplace=True)#返回一个删除了行索引为3的新DataFrame,原DataFrame不变new_df=df1.drop(3,axis=0,inplace=False)基本统计操作DataFrame提供了丰富的统计函数,如求和、均值、最大值、最小值等。print(df1.sum())#所有列的和print(df1.mean())#所有列的均值print(df1.max())#所有列的最大值print(df1.min())#所有列的最小值关于求均值时,可能会遇到不是数值型数据,故此可通过下述方法进行更正:#创建一个示例DataFramedata={'Name':['Alice','Bob','Charlie'],'Age':[25,30,35],'Salary':[50000,60000,70000]}df1=pd.DataFrame(data)#输出原DataFrameprint("原DataFrame:")print(df1)#选择数值类型的列numeric_df=df1.select_dtypes(include=[float,int])'''select_dtypes方法select_dtypes是Pandas中用于选择特定数据类型列的方法。它可以根据数据类型筛选出DataFrame中的列。include参数include参数指定了要选择的列的数据类型。在这个例子中,include=[float,int]表示选择所有数据类型为浮点数(float)和整数(int)的列'''#计算数值类型列的均值mean_values=numeric_df.mean()#输出均值print("\n数值类型列的均值:")print(mean_values)上述代码运行结果如下:原DataFrame:NameAgeSalary0Alice25500001Bob30600002Charlie3570000数值类型列的均值:Age30.0Salary60000.0dtype:float64过滤和条件操作可以使用条件语句对DataFrame进行过滤操作。#过滤年龄大于30的行filtered_df=df1[df1['Age']>30],print(filtered_df)'''其中关于df1['Age']>30返回的类型如下0False1False2TrueName:Age,dtype:bool'''缺失值处理DataFrame可以处理缺失值(NaN),并提供了相关的函数来检测和处理这些值。#创建一个DataFrame的副本df_with_nan=df1.copy()#将第二行(索引为1)的'Age'列值设为NaN(缺失值)df_with_nan.at[1,'Age']=np.nan#检测DataFrame中的缺失值,返回一个布尔类型的DataFrameprint(df_with_nan.isna())print("*"*20,"分隔符","*"*20)#填充DataFrame中的缺失值,用0代替所有NaNfilled_df=df_with_nan.fillna(0)print(filled_df)print("*"*20,"分隔符","*"*20)#删除包含缺失值的行dropped_df=df_with_nan.dropna()print(dropped_df)上述代码运行结果如下:NameAgeSalary0FalseFalseFalse1FalseTrueFalse2FalseFalseFalse********************分隔符********************NameAgeSalary0Alice25.0500001Bob0.0600002Charlie35.070000********************分隔符********************NameAgeSalary0Alice25.0500002Charlie35.070000DataFrame的应用场景数据分析与处理DataFrame非常适合进行数据分析和处理,包括数据清洗、数据转换和特征工程等。#数据描述print(df1.describe())print("*"*20,"分隔符","*"*20)#数据分组和聚合grouped=df1.groupby('Age').sum()print(grouped)print("*"*20,"分隔符","*"*20)#数据透视表pivot_table=df1.pivot_table(values='Salary',index='Name',columns='Age')print(pivot_table)上述代码运行结果如下:AgeSalarycount3.03.0mean30.060000.0std5.010000.0min25.050000.025%27.555000.050%30.060000.075%32.565000.0max35.070000.0********************分隔符********************NameSalaryAge25Alice5000030Bob6000035Charlie70000********************分隔符********************Age253035NameAlice50000.0NaNNaNBobNaN60000.0NaNCharlieNaNNaN70000.0数据可视化可以结合可视化库如Matplotlib或Seaborn进行数据可视化。#创建画布并分割成1行3列的子图fig,axs=plt.subplots(1,3,figsize=(18,5))#简单折线图df1.plot(x='Name',y='Salary',kind='line',ax=axs[0])axs[0].set_title('SimpleLinePlot')#条形图df1.plot(x='Name',y='Salary',kind='bar',ax=axs[1])axs[1].set_title('BarPlot')#使用Seaborn绘制分布图sns.histplot(df1['Salary'],ax=axs[2])axs[2].set_title('SalaryDistribution')#调整子图间距plt.tight_layout()#显示图形plt.show()数据导入和导出DataFrame可以轻松地从多种数据源导入数据,也可以将数据导出到不同的文件格式。#导出到CSV文件df1.to_csv('output.csv',index=False)#导出到Excel文件df1.to_excel('output.xlsx',index=False)DataFrame与其他数据结构的比较与Series:Series是一维的,DataFrame是二维的。DataFrame的每一列都是一个Series。与Numpy数组:DataFrame基于Numpy数组构建,但提供了更多的功能,如标签、缺失值处理等。与字典:DataFrame可以看作是一个由Series组成的字典,每个Series代表DataFrame的一列。结论DataFrame是Pandas中非常重要的数据结构,提供了丰富的功能和方法,适合处理二维数据。无论是在数据分析、数据清洗还是数据可视化中,DataFrame都能够提供极大的便利。希望通过这篇总结,能够为读者以及自己能够更好地理解和应用DataFrame,更好的在实际学习与工作中应用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 05:55 , Processed in 0.417939 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表