|
目录前言1.DataFrame简介2.DataFrame的特点3.DataFrame的创建3.1使用字典创建DataFrame3.2使用列表的列表(或元组)创建DataFrame3.3使用NumPy数组创建DataFrame3.4使用Series构成的字典创建DataFrame3.5使用字典构成的字典创建DataFrame4.从CSV文件读取5.DataFrame的属性和方法5.1查看DataFrame5.2访问数据5.3修改数据5.4DataFrame的属性5.5DataFrame的方法前言大家好!我是架构筑梦的Cherry,本期跟大家分享的知识是pandas数据结构——DataFrame。作者的【Python智能工坊】专栏及【少儿编程Python:趣味编程,探索未来】正在火热更新中🔥🔥🔥,如果本文对您有帮助,欢迎大家点赞+评论+收藏!1.DataFrame简介DataFrame是pandas库中最重要的数据结构之一,它用于存储和操作二维标签化的数据结构(即表格型数据)。它的强大功能、灵活性以及易用性,使其成为数据分析领域的重要工具。在DataFrame中,我们可以拥有行(index)和列(columns),每个单元格可以包含任何数据类型(如整数、浮点数、字符串、Python对象等)。2.DataFrame的特点二维标签化数据结构:DataFrame是一个二维表格型数据结构,具有行和列的标签,允许用户通过索引或列名方便地访问和操作数据。灵活的数据类型:DataFrame中的每一列可以是不同的数据类型,如整数、浮点数、字符串、布尔值等。这使得DataFrame能够存储和处理复杂的数据集。丰富的索引功能:DataFrame支持多级索引,可以通过行标签(index)和列标签(columns)进行快速的数据访问。此外,DataFrame还支持基于条件的索引,允许用户根据特定条件筛选和查询数据。强大的数据处理能力:DataFrame提供了丰富的数据处理功能,包括数据排序、筛选、分组、汇总、连接等。这些功能使得用户能够轻松地对数据进行清洗、转换和分析,以满足不同的数据分析需求。与其他工具的集成:DataFrame可以与许多其他工具和库(如NumPy、SciPy、Matplotlib等)进行集成,为用户提供更加全面和强大的数据处理和可视化功能。易于使用和理解:DataFrame的语法和API设计得非常直观和易于理解,使得用户能够快速上手并熟练掌握其使用方法。同时,pandas库还提供了丰富的文档和示例代码,帮助用户更好地理解和应用DataFrame。高性能和可扩展性:DataFrame在数据处理方面具有很高的性能,能够快速地处理大规模数据集。此外,pandas库还提供了可扩展的接口和工具,允许用户根据自己的需求进行定制和优化。广泛的应用场景:DataFrame广泛应用于数据分析、数据科学、机器学习等领域。无论是在商业智能、金融分析还是科学研究方面,DataFrame都发挥着重要的作用。3.DataFrame的创建在pandas库中,DataFrame的创建可以通过多种方式实现,以下是几种常见且清晰的创建方法:使用字典创建DataFrame使用列表的列表(或元组)创建DataFrame使用NumPy数组创建DataFrame使用Series构成的字典创建DataFrame使用字典构成的字典创建DataFramepd.DataFrame()是创建DataFrame的常用方法,格式如下:pd.DataFrame(data=None,index=None,columns=None,dtype=None,copy=False)1参数说明:data:用于创建DataFrame的数据,可以是二维数组、列表的列表、字典等。index:指定DataFrame的行标签,默认为整数序列。columns:指定DataFrame的列标签,如果数据中包含列名则无需指定。dtype:指定DataFrame中列的数据类型。copy:是否复制输入数据,默认为False。以下是一些关于DataFrame的实例:3.1使用字典创建DataFrame这是最直观和常用的创建方式之一。当已经有一组数据并且明确了每列的数据和列名时,可以使用字典来创建DataFrame。importpandasaspd#使用字典列表创建data={'A':[1,2,3],'B':[4,5,6],'C':['p','q','r']}df=pd.DataFrame(data)print(df)12345678910输出:ABC014p125q236r12343.2使用列表的列表(或元组)创建DataFrame当数据已经以记录方式(即每条记录是一个列表或元组)组织好,并且只需要添加列名时,可以使用此方法。importpandasaspd#使用列表的列表创建DataFramedata=[['Alice',25,'NewYork'],['Bob',30,'Paris'],['Charlie',35,'London']]#创建DataFrame,并指定列名df=pd.DataFrame(data,columns=['Name','Age','City'])print(df)12345678输出:NameAgeCity0Alice25NewYork1Bob30Paris2Charlie35London12343.3使用NumPy数组创建DataFrame如果已经有NumPy数组,并且想将其转换为DataFrame,可以这样做。importpandasaspdimportnumpyasnp#创建NumPy数组nums=np.array([[1,2,3],[4,5,6],[7,8,9]])#创建DataFrame,并指定列名和索引df=pd.DataFrame(nums,columns=['A','B','C'],index=['row1','row2','row3'])print(df)12345678910输出:ABCrow1123row2456row378912343.4使用Series构成的字典创建DataFrame当数据是pandas的Series对象时,也可以将其组合成字典来创建DataFrame。importpandasaspdimportnumpyasnp#创建Series对象s1=pd.Series([1,2,3],name='A')s2=pd.Series([4,5,6],name='B')#创建DataFramedf=pd.DataFrame({'A':s1,'B':s2})print(df)12345678910输出:AB01412523612343.5使用字典构成的字典创建DataFrame此方法适用于数据是嵌套的字典结构,外层的字典键作为列名,内层的字典键作为行索引。importpandasaspd#嵌套字典数据data={'a':{'一':1,'二':2},'b':{'一':10,'二':20},'c':{'一':100,'二':200}}#创建DataFramedf=pd.DataFrame(data)print(df)123456789101112输出:abc一110100二220200123这些方法是创建DataFrame的常见方式,可以根据具体的数据结构和需求选择最适合的方法。4.从CSV文件读取在pandas库中,从CSV(CommaSeparatedValues)文件读取数据以创建DataFrame是非常常见的操作。这可以通过pd.read_csv()函数来实现。以下是一些使用pd.read_csv()函数的基本示例和参数说明:importpandasaspd#读取CSV文件df=pd.read_csv('file.csv')#显示DataFrame内容print(df)1234567pd.read_csv()函数有很多参数可以定制读取行为,以下是一些常用的参数:filepath_or_buffer:文件路径或类似文件的对象。这是必须的参数。sep或delimiter:字段分隔符,默认为,。如果你的CSV文件使用其他分隔符(如制表符\t),你需要更改这个参数。header:用作列名的行号。默认为0(即第一行)。如果CSV文件没有行,可以设置为None,并使用names参数手动指定列名。names:如果数据不包含列,则可以使用此参数指定列名列表。index_col:用作行索引的列编号或列名。如果未指定,则使用默认的整数索引。usecols:返回列的子集。可以是列名的列表,也可以是列编号的列表。dtype:列的数据类型。可以是单个类型,也可以是为每列指定的字典。nrows:要读取的行数。这对于大文件特别有用,因为可以只读取前几行进行快速测试。skiprows:要跳过的行数(从文件开始处计算)。encoding:用于文件解码的字符编码。例如,‘utf-8’。parse_dates:尝试将数据解析为日期。可以是布尔值,表示是否尝试解析所有列,也可以是列名的列表或解析指令的列表。keep_default_na:如果指定了na_values参数,并且keep_default_na为False,则忽略默认的NaN值(如空字符串)。na_values:识别为NaN或None的附加字符串列表。thousands:用于解析数字的千位分隔符,如’,‘或’.'。skipinitialspace:跳过字段中前导的空白字符。comment:标记要忽略的行。任何包含此行标记的行都将被忽略。5.DataFrame的属性和方法5.1查看DataFrame*使用`print(df)`或直接在JupyterNotebook中查看*使用`df.head(n)`查看前n行(默认为5行)*使用`df.tail(n)`查看后n行123示例1:使用print(df)或直接在JupyterNotebook中查看在JupyterNotebook中,通常不需要显式调用print(df)来显示DataFrame。您只需将变量df(在这里它引用了您的DataFrame)作为一个独立的表达式或作为最后一行写入一个代码单元格,然后运行该单元格。JupyterNotebook将自动显示df的内容。importpandasaspd#假设我们有一个名为'example.csv'的CSV文件df=pd.read_csv('example.csv')#在JupyterNotebook中,只需运行以下行(无需print)df1234567注意:如果您在标准的Python脚本或交互式环境中工作,则需要使用print(df)来显示DataFrame的内容。示例2:使用df.head(n)查看前n行(默认为5行)df.head(n)函数允许您查看DataFrame的前n行。如果未指定n,则默认显示前5行。importpandasaspd#假设我们有一个名为'example.csv'的CSV文件df=pd.read_csv('example.csv')#显示前5行(默认)print(df.head())#显示前10行print(df.head(10))12345678910示例3:使用df.tail(n)查看后n行类似地,df.tail(n)函数允许您查看DataFrame的最后n行。如果未指定n,则默认显示最后5行。importpandasaspd#假设我们有一个名为'example.csv'的CSV文件df=pd.read_csv('example.csv')#显示最后5行(默认)print(df.tail())#显示最后10行print(df.tail(10))123456789105.2访问数据*通过列名访问整列数据:`df['A']`*通过位置访问列:`df.iloc[:,0]`(等价于`df['A']`但基于位置)*通过标签访问列:`df.loc[:,'A']`(也等价于`df['A']`但基于标签)*访问单个元素:`df.at[row_label,'A']`或`df.iat[row_position,0]`*访问多行多列:使用切片或布尔索引12345示例1:通过列名访问整列数据#假设我们有一个DataFramedf,它有一个名为'A'的列col_a=df['A']12示例2:通过位置访问列#使用iloc基于整数位置索引访问第一列(位置为0的列)#注意这不一定等同于df['A'],除非'A'确实是第一列col_by_position=df.iloc[:,0]123示例3:通过标签访问列#使用loc基于标签索引访问名为'A'的列#这与df['A']等效col_by_label=df.loc[:,'A']123示例4:访问单个元素有两种主要方式访问单个元素:使用.at[]基于标签:#假设我们想要访问标签为'row_label'的行和名为'A'的列中的元素element_at=df.at['row_label','A']12使用.iat[]基于整数位置:#假设我们想要访问第一行(位置为0)和第一列(位置为0)中的元素#注意这通常不会直接对应于'A'列,除非'A'是第一列,且'row_label'是第一行的标签element_iat=df.iat[0,0]#但如果你知道'A'是第n列,可以这样访问:n=df.columns.get_loc('A')#获取'A'列的整数位置row_position=0#假设要访问第一行element_specific_iat=df.iat[row_position,n]1234567示例5:访问多行多列–使用切片#访问前两行和前两列(基于位置)subset_by_slice=df.iloc[:2,:2]#访问名为'A'和'B'的列(基于标签)subset_by_slice_label=df.loc[:,['A','B']]12345–使用布尔索引#假设我们有一个条件来选择某些行(例如,'A'列的值大于10)mask=df['A']>10#选择满足条件的行和所有列subset_by_condition=df[mask]#或者,选择满足条件的行和特定的列(例如,'B'和'C'列)subset_by_condition_and_columns=df.loc[mask,['B','C']]12345675.3修改数据*直接修改列的值:`df['A']=[10,20,30]`*添加新列:`df['D']=[100,200,300]`*删除列:`deldf['A']`或`df=df.drop(columns=['A'])`*删除行:`df=df.drop(index=[0,1])`(注意这会改变原始的index)1234示例1:直接修改列的值importpandasaspd#创建一个简单的DataFramedata={'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]}df=pd.DataFrame(data)df['A']=[10,20,30]print("\n修改列'A'后的DataFrame:")print(df)12345678910111213输出:ABC0104712058230691234示例2:添加新列df['D']=[100,200,300]print("\n添加新列'D'后的DataFrame:")print(df)123输出:ABCD0104710012058200230693001234示例3:删除列deldf['A']print("\n使用del删除列'A'后的DataFrame:")print(df)123输出:BCD0471001582002693001234示例4:使用drop方法df=df.drop(columns=['B'])print("\n使用drop方法删除列'B'后的DataFrame:")print(df)123输出:CD0710018200293001234示例5:删除行df=df.drop(index=[0,1])print("\n删除索引为0和1的行后的DataFrame:")print(df)123输出:CD2930012注意:在删除行或列后,原始的index可能会被改变(取决于你是否重置了index)。如果你希望保留原始的index值(即使行被删除),你可能需要使用reset_index方法并设置drop=True来避免旧的index成为DataFrame的一部分。5.4DataFrame的属性*`df.shape`:返回DataFrame的形状(行数,列数)*`df.dtypes`:返回每列的数据类型*`df.index`:返回行标签*`df.columns`:返回列标签*`df.values`:返回DataFrame的ndarray表示12345示例:importpandasaspd#创建一个简单的DataFramedata={'A':[1,2,3],'B':[4.0,5.0,6.0],'C':['foo','bar','baz'],'D':pd.date_range(start='2023-01-01',periods=3)}df=pd.DataFrame(data)#获取DataFrame的形状(行数,列数)print("ShapeofDataFrame:",df.shape)#输出:ShapeofDataFrame3,4)#获取每列的数据类型print("Datatypesofcolumns:",df.dtypes)#输出:Datatypesofcolumns:Aint64 #Bfloat64 #Cobject #Ddatetime64[ns] #dtypebject#获取行标签print("Rowlabels(index):",df.index)#输出:Rowlabels(index):RangeIndex(start=0,stop=3,step=1)#获取列标签print("Columnlabels:",df.columns)#输出:Columnlabels:Index(['A','B','C','D'],dtype='object')#获取DataFrame的ndarray表示print("NumPyndarrayrepresentation:",df.values)#输出:#NumPyndarrayrepresentation:[[14.0'foo'Timestamp('2023-01-0100:00:00')]#[25.0'bar'Timestamp('2023-01-0200:00:00')]#[36.0'baz'Timestamp('2023-01-0300:00:00')]]1234567891011121314151617181920212223242526272829303132335.5DataFrame的方法*`df.describe()`:提供DataFrame的统计摘要*`df.sort_values(by='column_name')`:按指定列的值排序*`df.groupby('column_name')`:按指定列的值进行分组*`df.merge(other_df,on='column_name')`:基于指定列合并两个DataFrame*`df.pivot(index='column1',columns='column2',values='column3')`:将数据重塑为表格格式12345当然,以下是您给出的pandasDataFrame操作的示例:示例1:df.describe():提供DataFrame的统计摘要importpandasaspd#创建一个简单的DataFramedata={'A':[1,2,3,4,5],'B':[10,20,30,20,15],'C':[100,200,50,30,20]}df=pd.DataFrame(data)#提供DataFrame的统计摘要print(df.describe())123456789101112输出:ABCcount5.0000005.0000005.000000mean3.00000019.00000080.000000std1.5811397.41619873.824115min1.00000010.00000020.00000025%2.00000015.00000030.00000050%3.00000020.00000050.00000075%4.00000020.000000100.000000max5.00000030.000000200.000000123456789这将输出每列的基本统计信息,如计数、均值、标准差、最小值、25%分位数、中位数、75%分位数和最大值。示例2:df.sort_values(by=‘column_name’):按指定列的值排序#按列'B'的值排序sorted_df=df.sort_values(by='B')print(sorted_df)123这将按‘B’列的值对DataFrame进行排序。输出:ABC01101004515203420301220200233050123456示例3:df.groupby(‘column_name’):按指定列的值进行分组#按列'B'的值进行分组,并计算每组的'A'列的均值grouped=df.groupby('B')['A'].mean()print(grouped)123这将根据‘B’列的值对DataFrame进行分组,并计算每个组中‘A’列的均值。输出:B101.0155.0203.0303.0Name:A,dtype:float64123456示例4:df.merge(other_df,on=‘column_name’):基于指定列合并两个DataFrame#创建另一个DataFrameother_data={'B':[20,15,30,20],'D':['x','y','z','w']}other_df=pd.DataFrame(other_data)#基于'B'列合并两个DataFramemerged_df=df.merge(other_df,on='B')print(merged_df)12345678910这将基于‘B’列的值将两个DataFrame合并为一个新的DataFrame。输出:ABCD0220200x1220200w233050z342030x442030w551520y1234567示例5:df.pivot(index=‘column1’,columns=‘column2’,values=‘column3’):将数据重塑为表格格式#假设我们有一个如下的DataFramepivot_data={'year':[2020,2020,2021,2021],'product':['A','B','A','B'],'sales':[100,200,150,300]}pivot_df=pd.DataFrame(pivot_data)#使用pivot方法将数据重塑为表格格式pivoted_df=pivot_df.pivot(index='year',columns='product',values='sales')print(pivoted_df)1234567891011这将根据‘year’列的值创建行,根据‘product’列的值创建列,并将‘sales’列的值填入对应的单元格中。如果数据不能唯一地确定每个单元格的值(即存在重复的行/列组合),则pivot方法会抛出错误。在这种情况下,可以使用pivot_table方法,它允许进行聚合操作。输出:productAByear202010020020211503001234
|
|