Pandas 知识点全攻略:数据处理与分析的必备指南

一、Pandas简介

  1. 定义

    • Pandas是一个开源的、用于数据处理和分析的Python库。它建立在NumPy之上,提供了高效的数据结构和数据分析工具,使得在Python中处理和分析结构化数据变得更加容易。
    • 它主要有两个核心数据结构:SeriesDataFrameSeries是一种类似于一维数组的数据结构,它可以存储各种数据类型(如整数、浮点数、字符串等),并且带有索引。DataFrame是一个二维的表格型数据结构,它可以看作是由多个Series组成的,既有行索引也有列索引。
  2. 安装与导入

    • 安装:可以使用pip install pandas命令来安装Pandas库。如果使用Anaconda环境,Pandas通常已经预先安装好了。
    • 导入:在Python脚本或Jupyter Notebook中,通常使用import pandas as pd来导入Pandas库,这样在后续代码中就可以通过pd来访问Pandas的各种功能。

二、Series数据结构

  1. 创建Series

    • 从列表创建:
      • 例如,import pandas as pd; s = pd.Series([1, 3, 5, 7, 9]),这里创建了一个简单的Series,默认索引是从0开始的整数序列(0, 1, 2, 3, 4)。
    • 从字典创建:
      • 可以使用d = {'a': 10, 'b': 20, 'c': 30}; s = pd.Series(d),此时字典的键会成为Series的索引,对应的值为Series中的数据。
    • 指定索引创建:
      • s = pd.Series([10, 20, 30], index=['x', 'y', 'z']),通过这种方式可以自定义Series的索引。
  2. Series的属性

    • index:返回Series的索引。例如,对于上面创建的ss.index会返回Index(['x', 'y', 'z'], dtype='object')
    • values:返回Series中的数据值,是一个NumPy数组。例如,s.values会返回array([10, 20, 30])
  3. Series的索引和切片

    • 索引:可以使用索引标签来访问Series中的元素。例如,s['x']会返回10。如果索引是整数,也可以使用位置索引,如s[0](在索引是整数的情况下)。
    • 切片:可以使用类似于Python列表切片的方式来获取Series的一个子集。例如,s[1:3]会返回索引为yz对应的元素组成的Series
  4. 基本运算

    • 算术运算:Series之间可以进行算术运算。例如,如果有两个Series s1s2,且它们的索引相同,那么s1 + s2会将对应索引位置的元素相加,得到一个新的Series。如果索引不同,运算会根据共同的索引部分进行,缺失的部分会用NaN(Not a Number)填充。
    • 函数应用:可以将各种函数应用于Series。例如,s.abs()会返回每个元素绝对值组成的Seriess.mean()会计算Series的平均值。

三、DataFrame数据结构

  1. 创建DataFrame
    • 从字典创建:
      • 例如,data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35], 'city': ['New York', 'London', 'Paris']}; df = pd.DataFrame(data),这里的字典的键会成为DataFrame的列名,每个列表中的元素会成为对应列的数据。
    • 从列表的字典创建:
      • 假设data = [{'name': 'Alice', 'age': 25, 'city': 'New York'}, {'name': 'Bob', 'age': 30, 'city': 'London'}]; df = pd.DataFrame(data),这种方式也可以创建DataFrame,每个字典代表一行数据。
    • 从外部文件读取:
      • 可以使用read_csv(读取CSV文件)、read_excel(读取Excel文件)等函数来创建DataFrame。例如,df = pd.read_csv('data.csv'),其中data.csv是包含数据的文件,文件中的第一行通常会被视为列名。
  2. DataFrame的属性
    • columns:返回DataFrame的列名。例如,对于上述创建的dfdf.columns会返回Index(['name', 'age', 'city'], dtype='object')
    • index:返回DataFrame的行索引,默认是从0开始的整数序列。可以通过设置index参数在创建DataFrame时自定义行索引。
    • values:返回DataFrame中的数据值,是一个二维的NumPy数组。例如,df.values会返回一个包含数据的数组。
  3. DataFrame的索引和切片
    • 列索引:可以使用列名来访问DataFrame中的列。例如,df['name']会返回DataFrame中的name列,这实际上是一个Series。也可以使用df.name(前提是列名是有效的Python标识符)来访问列。
    • 行索引:可以使用iloc(基于整数位置的索引)和loc(基于标签的索引)来访问行。例如,df.iloc[0]会返回第一行数据(以整数位置为索引),这是一个Seriesdf.loc[0](假设行索引是整数且0是其中一个索引标签)会返回索引为0的行数据。
    • 切片:
      • 列切片:df[['name', 'age']]会返回包含nameage列的DataFrame
      • 行切片:使用ilocloc进行行切片。例如,df.iloc[0:2]会返回前两行数据(整数位置索引),df.loc[0:1](如果行索引是合适的标签)会返回索引从0到1的行数据。
  4. 基本运算和操作
    • 算术运算:DataFrame之间可以进行算术运算,规则和Series类似。例如,df1 + df2会将对应位置的元素相加(前提是两个DataFrame的形状和索引、列名等匹配)。
    • 函数应用:可以将函数应用于DataFrame的行或列。例如,df['age'].apply(lambda x: x + 1)会将age列中的每个元素加1。也可以使用df.apply(func, axis = 0)(对列应用函数)或df.apply(func, axis = 1)(对行应用函数)来应用自定义函数,其中func是要应用的函数。

四、数据清洗和预处理

  1. 缺失值处理
    • 检测缺失值:DataFrameSeries中有isnull()notnull()方法来检测缺失值。例如,df.isnull()会返回一个布尔型的DataFrame,其中缺失值对应的位置为True,非缺失值为False
    • 处理缺失值:
      • 删除缺失值:可以使用dropna()方法。例如,df.dropna()会删除包含缺失值的行。如果想删除包含缺失值的列,可以使用dropna(axis = 1)
      • 填充缺失值:可以使用fillna()方法。例如,df.fillna(0)会将所有缺失值用0填充。也可以使用其他填充策略,如df['column'].fillna(df['column'].mean())会用该列的平均值填充缺失值。
  2. 重复值处理
    • 检测重复值:DataFrame中有duplicated()方法来检测重复行,返回一个布尔型的Series,其中重复行的第一个出现位置为False,后续重复位置为True
    • 删除重复值:可以使用drop_duplicates()方法来删除重复行。例如,df.drop_duplicates()会删除DataFrame中的重复行。
  3. 数据类型转换
    • 查看数据类型:可以使用dtypes属性来查看DataFrame各列的数据类型。例如,df.dtypes会返回每列的数据类型,如name列可能是object(字符串类型),age列可能是int64
    • 转换数据类型:可以使用astype()方法来转换数据类型。例如,df['age'].astype(float)会将age列的数据类型转换为浮点数。

五、数据合并与连接

  1. 合并(merge)
    • merge函数类似于SQL中的JOIN操作。例如,有两个DataFrame df1df2result = pd.merge(df1, df2, on='key')会根据key列将两个DataFrame合并。如果key列在两个DataFrame中有不同的列名,可以使用left_onright_on参数来指定。
    • 合并方式有多种,如inner(内连接,只保留两个DataFramekey列匹配的行)、outer(外连接,保留所有行)、left(左连接,以左边的DataFrame为主,保留左边所有行)和right(右连接,以右边的DataFrame为主,保留右边所有行),可以通过how参数来指定合并方式。
  2. 连接(concat)
    • concat函数用于沿着某个轴(行或列)连接DataFrame。例如,result = pd.concat([df1, df2], axis = 0)会将df1df2按行连接,result = pd.concat([df1, df2], axis = 1)会将它们按列连接。
    • 当按列连接时,如果列名有重复,可能需要处理冲突。可以使用ignore_index=True参数来重新生成索引。

六、数据分组与聚合

  1. 分组(groupby)
    • 可以使用groupby方法根据一个或多个列对DataFrame进行分组。例如,grouped = df.groupby('category'),这里根据category列对df进行分组,grouped是一个分组对象。
    • 可以对分组后的对象进行迭代,每次迭代返回一个组名和对应的子DataFrame。例如,for group_name, group_data in grouped:可以用来遍历分组后的各个组。
  2. 聚合(aggregation)
    • 在分组后可以使用agg(或aggregate)方法进行聚合操作。例如,grouped.agg('mean')会计算每个组的平均值。也可以使用自定义函数进行聚合,如grouped.agg(lambda x: x.max() - x.min())来计算每个组的最大值和最小值之差。
    • 可以同时对多个列进行不同的聚合操作。例如,grouped.agg({'column1':'sum', 'column2':'mean'})会对column1列求和,对column2列求平均值。

七、时间序列处理(如果数据涉及时间)

  1. 日期时间类型转换
    • 可以使用pd.to_datetime()函数将包含日期时间信息的列转换为日期时间类型。例如,df['date'] = pd.to_datetime(df['date'])
  2. 时间序列索引
    • 可以将日期时间列设置为DataFrame的索引。例如,df.set_index('date', in_drop = True)会将date列设置为索引,并且删除原来的date列。
    • 基于时间序列索引可以进行一些特殊的操作,如按时间范围切片(例如,df['2020-01-01':'2020-02-01']会返回date索引在2020年1月1日到2020年2月1日之间的行)。
  3. 重采样(resample)
    • 对于时间序列数据,重采样可以改变数据的时间频率。例如,df.resample('M').sum()会将数据按月份进行重采样,并且对每个月的数据进行求和。resample方法的参数指定了重采样的频率,如D(天)、W(周)、M(月)等,后面可以跟上聚合函数来对重采样后的数据进行处理。
posted @ 2024-12-25 15:09  软件职业规划  阅读(45)  评论(0编辑  收藏  举报