Python Pandas库的常见用法(非常详细,附带实例)
Pandas 是 Python 的一个数据处理库,具有强大的数据处理和清洗功能,非常适合进行数据分析。
Pandas 要支持两种数据结构:Series 和 DataFrame。
如果用户使用 pip 管理 Python 包,则可以通过在终端输入如下指令安装 Pandas。:
如果用户使用 conda 作为 Python 环境和包管理器,则用户可以在终端输入如下指令安装 Pandas:
在使用 Pandas 前,需要先进行导入:
下面用 Python 的字典创建一个 DataFrame:
当用户选择单列时可使用单括号,如 df['name']; 选择多列时使用双括号,如 df[['name','age']]。这是因为在选择多列时,实际上是向 DataFrame 传递了一个列表,而列表需要用括号进行定义。
用户可以使用 loc 和 iloc 进行更复杂的数据选择:
在上面的代码中,需要掌握如下知识:
df['age_category']=df['age'].apply (age_category) 这行代码对 age 列应用 age_category() 函数。Apply() 函数接受一个函数,并将这个函数应用到 DataFrame 或 Series 的每一个元素上。在这种情况下,apply() 函数先对 age 列的每一个元素应用 age_category() 函数,然后将结果赋值给新的列 age_category。因此,新的列 age_category 包含每个人的年龄类别。
在默认情况下,merge() 方法将在两个 DataFrame 中找到公共的列,在上面的案例中是 employee 列,并基于这个公共列的值,将 df1 和 df2 的行合并到一起,这种合并方式被称为内连接(Inner Join),这种合并方式只保留在两个 DataFrame 中共有键的那一行。
默认情况下,concat() 方法按照行(axis=0)进行拼接,如果用户希望按照列进行拼接,则可以通过设置参数 axis=1 实现。
melt() 方法接受 id_vars 和 value_vars 这两个主要参数:
在上面的例子中,A 列的值保持不变,B 列和 C 列的值被转化为长格式。melt() 方法将创建一个新的 DataFrame,原始数据中被指定为 value_vars 的列中,每个值都将出现在新 DataFrame 的单独一行中,列会被转化为新的列 variable,值会被转化为新的列 value。
to_datetime() 函数接受一个字符串或字符串列表,并将它们转换为 Pandas 的 Timestamp 对象。Timestamp 对象是 Pandas 用来表示日期和时间的数据类型。这行代码将转换后的日期赋值给 date 列,并使用 date 列替换原来的字符串数据。
用户可使用 dt 属性访问日期的属性:
Pandas 要支持两种数据结构:Series 和 DataFrame。
导入Pandas
Python 自身并不包含 Pandas,它是一个需要独立安装的第三方库。如果用户使用的是一个新的 Python 环境,则可能还没有安装 Pandas。如果用户使用 pip 管理 Python 包,则可以通过在终端输入如下指令安装 Pandas。:
pip install pandas
如果用户使用 conda 作为 Python 环境和包管理器,则用户可以在终端输入如下指令安装 Pandas:
conda install pandas
在使用 Pandas 前,需要先进行导入:
import pandas as pd在这里,使用 pd 作为 Pandas 的别名,这是约定俗成的做法。
Pandas Series
Series 是 Pandas 的一种数据结构,是类似于数组的一维对象。用户可以用 Python 的列表创建一个 Series:import pandas as pd s = pd.Series([1,2,3,4,5]) print(s)上述代码的执行结果为:
0 1
1 2
2 3
3 4
4 5
dtype: int64
Pandas DataFrame
DataFrame 是 Pandas 中最常用的数据结构,是二维的、表格型的数据结构。下面用 Python 的字典创建一个 DataFrame:
import pandas as pd data = { 'name': ['John','Anna','Peter','Linda'], 'age': [28,24,35,32], 'city': ['New York','Paris','Berlin','London'] } df = pd.DataFrame(data) print(df)DataFrame的数据结构为:
name age city 0 John 28 New York 1 Anna 24 Paris 2 Peter 35 Berlin 3 Linda 32 London在上面的 DataFrame 中,每一行表示一个观察值(或是一个样本),每一列表示一个变量。DataFrame 既有行索引也有列索引,用户可以用这些索引选择感兴趣的数据。
Pandas的数据操作
Pandas 的数据提供了许多强大的数据操作,下面介绍一些常用的操作。1) 数据选择
在 Pandas 中,用户可以使用多种方式选择数据。例如,用户可以使用列名选择一个或多个列:print(df['name']) # 选择 name 列 print(df[['name','age']]) # 选择 name 和 age 列print(df[['name','age']]) 这行代码选择 name 和 age 列,并将其打印出来。用户可以通过传入一个包含列名的列表,在 DataFrame 中选择多个列,这将返回一个新的 DataFrame,该 DataFrame 包含原 DataFrame 中的选定列。因此,df[['name','age']] 将返回一个新 DataFrame,新的 DataFrame 仅包含 name 和 age 两列的数据。
当用户选择单列时可使用单括号,如 df['name']; 选择多列时使用双括号,如 df[['name','age']]。这是因为在选择多列时,实际上是向 DataFrame 传递了一个列表,而列表需要用括号进行定义。
用户可以使用 loc 和 iloc 进行更复杂的数据选择:
print(df.loc[0]) # 选择第一行 print(df.loc[0,'name']) # 选择第一行的 name 列 print(df.iloc[0,0]) # 使用整数索引选择第一行的第一列
在上面的代码中,需要掌握如下知识:
- 在 Pandas 中,loc 和 iloc 是两种基于标签和整数位置(利用整数索引选择数据)的索引方式。
- print(df.loc[0]):这行代码通过 loc 属性选择标签为 0 的行,并将其打印出来。在 Pandas 中,可使用 DataFrame.loc[row_label] 选择一个单独的行,这将返回一个 Series 对象,该对象包含所选择的行的数据。
- print(df.loc[0, 'name']):这行代码使用 loc 属性,选择标签为 0 的行和标签为 name 的列的交叉点,并将其打印出来。在 Pandas 中,可以使用 DataFrame.loc[row_label, column_label] 选择特定行和列的数据。
- print(df.iloc[0, 0]):这行代码使用 iloc 属性选择第一行和第一列的交叉点,并将其打印出来。与 loc 不同,iloc 是基于整数位置的索引,而不是基于标签。因此,DataFrame.iloc[row_integer, column_integer] 将选择特定行和列的数据。在这里,由于 Python 的索引是从 0 开始的,iloc[0, 0] 将选择第一行的第一列。
- 在 Pandas 中,行标签和列标签可以是任意的哈希类型,包括但不限于整数和字符串类型。整数位置索引始终是从 0 开始的整数。
2) 数据过滤
用户可以使用布尔表达式过滤数据:print(df[df['age'] > 30]) # 选择年龄大于 30 的所有行在上面的代码中,需要掌握如下知识:
- df['age'] > 30:这个表达式会返回一个布尔 Series,Series 的长度与 DataFrame 的行数相同。每个元素代表对应行的 age 列是否大于 30。如果大于 30,则对应的元素为 True,否则为 False。
- df[df['age'] > 30]:这个表达式会选择 DataFrame 中对应 True 的行,用户可以通过在 DataFrame 的索引操作符 [] 内部传入一个布尔 Series,从而选择满足条件的行。
3) 数据排序
用户可以使用 sort_values() 函数对数据进行排序:print(df.sort_values('age')) # 按照 age 列进行排序
4) 数据统计
Pandas 提供了许多统计函数,如 mean()、median()、min()、max()。下面计算 age 列的平均值和最大值:print(df['age'].mean()) # 计算 age 列的平均值 print(df['age'].max()) # 计算 age 列的最大值
5) 数据处理
Pandas 提供了许多数据处理的函数。例如,可以使用 apply() 函数对数据进行处理:def age_category(age): if age < 30: return 'Young' else: return 'Old' df['age_category'] = df['age'].apply(age_category) print(df)上述代码会添加一个 age_category 列,该列的值由 age 列的值通过 age_category() 函数计算得到。
df['age_category']=df['age'].apply (age_category) 这行代码对 age 列应用 age_category() 函数。Apply() 函数接受一个函数,并将这个函数应用到 DataFrame 或 Series 的每一个元素上。在这种情况下,apply() 函数先对 age 列的每一个元素应用 age_category() 函数,然后将结果赋值给新的列 age_category。因此,新的列 age_category 包含每个人的年龄类别。
Pandas数据合并
Pandas 提供 merge() 和 concat() 这两种数据合并的方法。1) merge()方法
Merge() 方法用于合并两个 DataFrame。假设有两个 DataFrame,一个包含员工的基本信息,另一个包含员工的薪水信息,那么可以使用 merge() 方法合并这两个 DataFrame:df1 = pd.DataFrame({'employee': ['Bob','Jake','Lisa'], 'group': ['Accounting','Engineering','Engineering']}) df2 = pd.DataFrame({'employee': ['Lisa','Bob','Jake'], 'salary': [70000,80000,120000]}) df3 = pd.merge(df1,df2) print(df3)上述代码的执行结果为:
employee group salary 0 Bob Accounting 80000 1 Jake Engineering 120000 2 Lisa Engineering 70000df3=pd.merge(df1, df2) 这行代码使用 merge() 方法,将 df1 和 df2 合并到一起。
在默认情况下,merge() 方法将在两个 DataFrame 中找到公共的列,在上面的案例中是 employee 列,并基于这个公共列的值,将 df1 和 df2 的行合并到一起,这种合并方式被称为内连接(Inner Join),这种合并方式只保留在两个 DataFrame 中共有键的那一行。
2) concat()方法
concat() 方法用于将多个 DataFrame 沿着垂直方向或水平方向进行连接:df1 = pd.DataFrame({'A': ['A0','A1','A2','A3'], 'B': ['B0','B1','B2','B3']}) df2 = pd.DataFrame({'A': ['A4','A5','A6','A7'], 'B': ['B4','B5','B6','B7']}) df3 = pd.concat([df1,df2]) print(df3)上述代码的执行结果为:
A B 0 A0 B0 1 A1 B1 2 A2 B2 3 A3 B3 4 A4 B4 5 A5 B5 6 A6 B6 7 A7 B7df3=pd.concat([df1, df2]) 这行代码使用 Pandas 的 concat() 方法,将 df1 和 df2 按照行(纵向)进行拼接。concat() 方法接受一个 DataFrame 作为输入,并将这些 DataFrame 在同一个方向上拼接到一起。
默认情况下,concat() 方法按照行(axis=0)进行拼接,如果用户希望按照列进行拼接,则可以通过设置参数 axis=1 实现。
Pandas数据重塑
Pandas 提供了 pivot() 和 melt() 方法进行数据重塑。1) pivot()方法
pivot() 方法用于将长格式的数据转换为宽格式的数据,例如:df = pd.DataFrame({'date': ['2015-01-01','2015-01-01','2015-01-02','2015-01-02'], 'variable': ['A','B','A','B'], 'value': [1,2,3,4]}) df_pivot = df.pivot(index='date',columns='variable',values='value') print(df_pivot)上述代码的执行结果为:
variable A B date 2015-01-01 1 2 2015-01-02 3 4df_pivot=df.pivot(index='date', columns='variable', values='value') 这行代码使用 Pandas 的 pivot() 方法,将长格式的 DataFrame 转化为宽格式。pivot() 方法接受三个参数:index、columns 和 values。在这种情况下,date 列设置为索引,variable 列的值转化为新的列,value 列的值填充到相应位置。
2) melt()方法
melt() 方法用于将宽格式的数据转换为长格式的数据,例如:df = pd.DataFrame({'A': {0: 'a',1: 'b',2: 'c'}, 'B': {0: 1,1: 3,2: 5}, 'C': {0: 2,1: 4,2: 6}}) df_melt = df.melt(id_vars=['A'],value_vars=['B','C']) print(df_melt)上述代码的执行结果为:
A variable value 0 a B 1 1 b B 3 2 c B 5 3 a C 2 4 b C 4 5 c C 6df_melt=df.melt(id_vars=['A'], value_vars=['B','C']) 这行代码使用 Pandas 的 melt() 方法,将宽格式的 DataFrame 转化为长格式。
melt() 方法接受 id_vars 和 value_vars 这两个主要参数:
- id_vars 定义了需要保留的列,这些列的数据不会被改变;
- value_vars 定义了需要转化为长格式的列。
在上面的例子中,A 列的值保持不变,B 列和 C 列的值被转化为长格式。melt() 方法将创建一个新的 DataFrame,原始数据中被指定为 value_vars 的列中,每个值都将出现在新 DataFrame 的单独一行中,列会被转化为新的列 variable,值会被转化为新的列 value。
Pandas字符串处理
Pandas 提供了 str() 方法,便于进行字符串处理。例如,用户可以使用 str.lower() 方法,将字符串转换为小写:df = pd.DataFrame({'A': ['aBc','IJK','XYZ'], 'B': ['abc','ijk','xyz']}) df['A'] = df['A'].str.lower() print(df)上述代码的执行结果为:
A B 0 abc abc 1 ijk ijk 2 xyz xyz
Pandas时间序列处理
Pandas 提供了丰富的时间序列处理方法。例如,用户可以使用 to_datetime() 方法,将字符串转换为日期:df = pd.DataFrame({'date': ['2015-01-01','2015-01-02','2015-01-03']}) df['date'] = pd.to_datetime(df['date']) print(df)上述代码的执行结果为:
date 0 2015-01-01 1 2015-01-02 2 2015-01-03df['date']=pd.to_datetime(df['date']) 这行代码使用 Pandas 的 to_datetime() 函数,将 date 列的数据从字符串格式转换为日期格式。
to_datetime() 函数接受一个字符串或字符串列表,并将它们转换为 Pandas 的 Timestamp 对象。Timestamp 对象是 Pandas 用来表示日期和时间的数据类型。这行代码将转换后的日期赋值给 date 列,并使用 date 列替换原来的字符串数据。
用户可使用 dt 属性访问日期的属性:
print(df['date'].dt.year) # 获取年份 print(df['date'].dt.month) # 获取月份 print(df['date'].dt.day) # 获取日期dt 是 pandas.Series 对象的一个属性访问器,提供了访问 Timestamp 对象属性的方法。在上述例子中,dt 访问 date 列的每个元素。这些元素是 Timestamp 对象,因为这些元素已经使用 to_datetime() 函数转换为日期时间格式了。