Pandas 知识点全攻略:数据处理与分析的必备指南
一、Pandas简介
-
定义
- Pandas是一个开源的、用于数据处理和分析的Python库。它建立在NumPy之上,提供了高效的数据结构和数据分析工具,使得在Python中处理和分析结构化数据变得更加容易。
- 它主要有两个核心数据结构:
Series
和DataFrame
。Series
是一种类似于一维数组的数据结构,它可以存储各种数据类型(如整数、浮点数、字符串等),并且带有索引。DataFrame
是一个二维的表格型数据结构,它可以看作是由多个Series
组成的,既有行索引也有列索引。
-
安装与导入
- 安装:可以使用
pip install pandas
命令来安装Pandas库。如果使用Anaconda环境,Pandas通常已经预先安装好了。 - 导入:在Python脚本或Jupyter Notebook中,通常使用
import pandas as pd
来导入Pandas库,这样在后续代码中就可以通过pd
来访问Pandas的各种功能。
- 安装:可以使用
二、Series数据结构
-
创建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
的索引。
- 从列表创建:
-
Series的属性
index
:返回Series
的索引。例如,对于上面创建的s
,s.index
会返回Index(['x', 'y', 'z'], dtype='object')
。values
:返回Series
中的数据值,是一个NumPy数组。例如,s.values
会返回array([10, 20, 30])
。
-
Series的索引和切片
- 索引:可以使用索引标签来访问
Series
中的元素。例如,s['x']
会返回10
。如果索引是整数,也可以使用位置索引,如s[0]
(在索引是整数的情况下)。 - 切片:可以使用类似于Python列表切片的方式来获取
Series
的一个子集。例如,s[1:3]
会返回索引为y
和z
对应的元素组成的Series
。
- 索引:可以使用索引标签来访问
-
基本运算
- 算术运算:
Series
之间可以进行算术运算。例如,如果有两个Series
s1
和s2
,且它们的索引相同,那么s1 + s2
会将对应索引位置的元素相加,得到一个新的Series
。如果索引不同,运算会根据共同的索引部分进行,缺失的部分会用NaN
(Not a Number)填充。 - 函数应用:可以将各种函数应用于
Series
。例如,s.abs()
会返回每个元素绝对值组成的Series
,s.mean()
会计算Series
的平均值。
- 算术运算:
三、DataFrame数据结构
- 创建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
是包含数据的文件,文件中的第一行通常会被视为列名。
- 可以使用
- 从字典创建:
- DataFrame的属性
columns
:返回DataFrame
的列名。例如,对于上述创建的df
,df.columns
会返回Index(['name', 'age', 'city'], dtype='object')
。index
:返回DataFrame
的行索引,默认是从0开始的整数序列。可以通过设置index
参数在创建DataFrame
时自定义行索引。values
:返回DataFrame
中的数据值,是一个二维的NumPy数组。例如,df.values
会返回一个包含数据的数组。
- DataFrame的索引和切片
- 列索引:可以使用列名来访问
DataFrame
中的列。例如,df['name']
会返回DataFrame
中的name
列,这实际上是一个Series
。也可以使用df.name
(前提是列名是有效的Python标识符)来访问列。 - 行索引:可以使用
iloc
(基于整数位置的索引)和loc
(基于标签的索引)来访问行。例如,df.iloc[0]
会返回第一行数据(以整数位置为索引),这是一个Series
;df.loc[0]
(假设行索引是整数且0是其中一个索引标签)会返回索引为0的行数据。 - 切片:
- 列切片:
df[['name', 'age']]
会返回包含name
和age
列的DataFrame
。 - 行切片:使用
iloc
或loc
进行行切片。例如,df.iloc[0:2]
会返回前两行数据(整数位置索引),df.loc[0:1]
(如果行索引是合适的标签)会返回索引从0到1的行数据。
- 列切片:
- 列索引:可以使用列名来访问
- 基本运算和操作
- 算术运算:
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
是要应用的函数。
- 算术运算:
四、数据清洗和预处理
- 缺失值处理
- 检测缺失值:
DataFrame
和Series
中有isnull()
和notnull()
方法来检测缺失值。例如,df.isnull()
会返回一个布尔型的DataFrame
,其中缺失值对应的位置为True
,非缺失值为False
。 - 处理缺失值:
- 删除缺失值:可以使用
dropna()
方法。例如,df.dropna()
会删除包含缺失值的行。如果想删除包含缺失值的列,可以使用dropna(axis = 1)
。 - 填充缺失值:可以使用
fillna()
方法。例如,df.fillna(0)
会将所有缺失值用0填充。也可以使用其他填充策略,如df['column'].fillna(df['column'].mean())
会用该列的平均值填充缺失值。
- 删除缺失值:可以使用
- 检测缺失值:
- 重复值处理
- 检测重复值:
DataFrame
中有duplicated()
方法来检测重复行,返回一个布尔型的Series
,其中重复行的第一个出现位置为False
,后续重复位置为True
。 - 删除重复值:可以使用
drop_duplicates()
方法来删除重复行。例如,df.drop_duplicates()
会删除DataFrame
中的重复行。
- 检测重复值:
- 数据类型转换
- 查看数据类型:可以使用
dtypes
属性来查看DataFrame
各列的数据类型。例如,df.dtypes
会返回每列的数据类型,如name
列可能是object
(字符串类型),age
列可能是int64
。 - 转换数据类型:可以使用
astype()
方法来转换数据类型。例如,df['age'].astype(float)
会将age
列的数据类型转换为浮点数。
- 查看数据类型:可以使用
五、数据合并与连接
- 合并(merge)
merge
函数类似于SQL中的JOIN
操作。例如,有两个DataFrame
df1
和df2
,result = pd.merge(df1, df2, on='key')
会根据key
列将两个DataFrame
合并。如果key
列在两个DataFrame
中有不同的列名,可以使用left_on
和right_on
参数来指定。- 合并方式有多种,如
inner
(内连接,只保留两个DataFrame
中key
列匹配的行)、outer
(外连接,保留所有行)、left
(左连接,以左边的DataFrame
为主,保留左边所有行)和right
(右连接,以右边的DataFrame
为主,保留右边所有行),可以通过how
参数来指定合并方式。
- 连接(concat)
concat
函数用于沿着某个轴(行或列)连接DataFrame
。例如,result = pd.concat([df1, df2], axis = 0)
会将df1
和df2
按行连接,result = pd.concat([df1, df2], axis = 1)
会将它们按列连接。- 当按列连接时,如果列名有重复,可能需要处理冲突。可以使用
ignore_index=True
参数来重新生成索引。
六、数据分组与聚合
- 分组(groupby)
- 可以使用
groupby
方法根据一个或多个列对DataFrame
进行分组。例如,grouped = df.groupby('category')
,这里根据category
列对df
进行分组,grouped
是一个分组对象。 - 可以对分组后的对象进行迭代,每次迭代返回一个组名和对应的子
DataFrame
。例如,for group_name, group_data in grouped:
可以用来遍历分组后的各个组。
- 可以使用
- 聚合(aggregation)
- 在分组后可以使用
agg
(或aggregate
)方法进行聚合操作。例如,grouped.agg('mean')
会计算每个组的平均值。也可以使用自定义函数进行聚合,如grouped.agg(lambda x: x.max() - x.min())
来计算每个组的最大值和最小值之差。 - 可以同时对多个列进行不同的聚合操作。例如,
grouped.agg({'column1':'sum', 'column2':'mean'})
会对column1
列求和,对column2
列求平均值。
- 在分组后可以使用
七、时间序列处理(如果数据涉及时间)
- 日期时间类型转换
- 可以使用
pd.to_datetime()
函数将包含日期时间信息的列转换为日期时间类型。例如,df['date'] = pd.to_datetime(df['date'])
。
- 可以使用
- 时间序列索引
- 可以将日期时间列设置为
DataFrame
的索引。例如,df.set_index('date', in_drop = True)
会将date
列设置为索引,并且删除原来的date
列。 - 基于时间序列索引可以进行一些特殊的操作,如按时间范围切片(例如,
df['2020-01-01':'2020-02-01']
会返回date
索引在2020年1月1日到2020年2月1日之间的行)。
- 可以将日期时间列设置为
- 重采样(resample)
- 对于时间序列数据,重采样可以改变数据的时间频率。例如,
df.resample('M').sum()
会将数据按月份进行重采样,并且对每个月的数据进行求和。resample
方法的参数指定了重采样的频率,如D
(天)、W
(周)、M
(月)等,后面可以跟上聚合函数来对重采样后的数据进行处理。
- 对于时间序列数据,重采样可以改变数据的时间频率。例如,