1.4 Pandas 数据结构:DataFrame 1.4 Pandas 数据结构:DataFrame DataFrame 是 Pandas 库中最核心的数据结构之一,它是一个二维的、大小可变的、潜在的异构表格型数据结构,具有带标签的轴(行和列)。你可以把它想象成一个 Excel 表格或 SQL 数据表,但拥有更强大的数据处理能力。 1.4.1 DataFrame 的特性 二维性: DataFrame 以行和列的形式组织数据,类似于表格。 大小可变: 可以动态地添加或删除行和列。 异构性: 每一列可以包含不同的数据类型(数值、字符串、布尔值等)。 带标签的轴: 行和列都有标签(索引),方便数据的访问和操作。 数据对齐: Pandas 会根据索引自动对齐数据,避免数据错位。
DataFrame 是 Pandas 库中最核心的数据结构之一,它是一个二维的、大小可变的、潜在的异构表格型数据结构,具有带标签的轴(行和列)。你可以把它想象成一个 Excel 表格或 SQL 数据表,但拥有更强大的数据处理能力。
二维性: DataFrame 以行和列的形式组织数据,类似于表格。
大小可变: 可以动态地添加或删除行和列。
异构性: 每一列可以包含不同的数据类型(数值、字符串、布尔值等)。
带标签的轴: 行和列都有标签(索引),方便数据的访问和操作。
数据对齐: Pandas 会根据索引自动对齐数据,避免数据错位。
缺失数据处理: 方便地处理缺失值(NaN)。
DataFrame 可以通过多种方式创建,以下是一些常见的方法:
1. 从字典创建
字典的键会成为列名,字典的值会成为列的数据。
import pandas as pd data = {'姓名': ['Alice', 'Bob', 'Charlie'], '年龄': [25, 30, 28], '城市': ['北京', '上海', '广州']} df = pd.DataFrame(data) print(df)
输出:
姓名 年龄 城市 0 Alice 25 北京 1 Bob 30 上海 2 Charlie 28 广州
2. 从列表创建
列表的元素会成为行,可以指定列名。
data = [['Alice', 25, '北京'], ['Bob', 30, '上海'], ['Charlie', 28, '广州']] df = pd.DataFrame(data, columns=['姓名', '年龄', '城市']) print(df)
输出:
姓名 年龄 城市 0 Alice 25 北京 1 Bob 30 上海 2 Charlie 28 广州
3. 从 Series 创建
Series 可以作为 DataFrame 的列。
s1 = pd.Series(['Alice', 'Bob', 'Charlie']) s2 = pd.Series([25, 30, 28]) s3 = pd.Series(['北京', '上海', '广州']) df = pd.DataFrame({'姓名': s1, '年龄': s2, '城市': s3}) print(df)
输出:
姓名 年龄 城市 0 Alice 25 北京 1 Bob 30 上海 2 Charlie 28 广州
4. 从 CSV 文件创建
这是最常用的方法之一,使用 pd.read_csv() 函数。
# 假设有一个名为 data.csv 的文件 # 姓名,年龄,城市 # Alice,25,北京 # Bob,30,上海 # Charlie,28,广州 df = pd.read_csv('data.csv') print(df)
输出:
姓名 年龄 城市 0 Alice 25 北京 1 Bob 30 上海 2 Charlie 28 广州
5. 从 Excel 文件创建
使用 pd.read_excel() 函数。
# 假设有一个名为 data.xlsx 的文件 df = pd.read_excel('data.xlsx') print(df)
代码示例:
创建一个DataFrame并打印其信息
import pandas as pd data = {'col1': [1, 2], 'col2': [3, 4]} df = pd.DataFrame(data=data) print(df) print(df.dtypes) #查看列的数据类型 print(df.index) #查看索引 print(df.columns) #查看列名
1. 查看数据
df.head(n): 查看前 n 行数据,默认为 5 行。
df.tail(n): 查看后 n 行数据,默认为 5 行。
df.info(): 查看 DataFrame 的信息,包括索引、列名、数据类型、非空值数量等。
df.describe(): 查看数值型列的统计信息,包括计数、均值、标准差、最小值、四分位数、最大值。
df.shape: 返回 DataFrame 的行数和列数。
2. 选择数据
选择列:
df['列名']: 选择单列,返回 Series。
df[['列名1', '列名2']]: 选择多列,返回 DataFrame。
选择行:
df.loc[索引]: 基于标签选择行。
df.iloc[位置]: 基于位置选择行。
选择特定单元格:
df.loc[索引, '列名']
df.iloc[位置, 列位置]
3. 增加列
直接赋值:df['新列名'] = 值
使用 insert() 方法:df.insert(位置, '新列名', 值)
4. 删除列
df.drop('列名', axis=1): 删除单列。
df.drop(['列名1', '列名2'], axis=1): 删除多列。
5. 增加行
df.loc[新索引] = [值1, 值2, ...]
df.append(新 DataFrame) (不推荐,效率较低)
6. 删除行
df.drop(索引): 删除单行。
df.drop([索引1, 索引2]): 删除多行。
7. 修改数据
df.loc[索引, '列名'] = 新值
df.iloc[位置, 列位置] = 新值
8. 排序
df.sort_values(by='列名', ascending=True/False): 按列排序。
df.sort_index(): 按索引排序。
代码示例:
import pandas as pd data = {'姓名': ['Alice', 'Bob', 'Charlie', 'David'], '年龄': [25, 30, 28, 22], '城市': ['北京', '上海', '广州', '深圳'], '工资': [5000, 6000, 5500, 4800]} df = pd.DataFrame(data) # 查看前两行 print(df.head(2)) # 查看DataFrame信息 print(df.info()) # 选择 '姓名' 列 print(df['姓名']) # 选择 '姓名' 和 '年龄' 列 print(df[['姓名', '年龄']]) # 选择索引为 1 的行 print(df.loc[1]) # 选择第 2 行 print(df.iloc[1]) # 选择 'Alice' 的年龄 print(df.loc[df['姓名'] == 'Alice', '年龄']) # 增加 '性别' 列 df['性别'] = ['女', '男', '男', '男'] print(df) # 删除 '城市' 列 df = df.drop('城市', axis=1) print(df) # 按年龄排序 df = df.sort_values(by='年龄', ascending=False) print(df)
DataFrame 的索引是其灵魂,它允许我们以高效的方式访问和操作数据。
行索引 (Index): 默认情况下,Pandas 会自动创建一个从 0 开始的整数索引。也可以使用 DataFrame 中的某一列作为索引。
列索引 (Columns): DataFrame 的列名。
设置索引
df.set_index('列名'): 将 DataFrame 的某一列设置为索引。
df.reset_index(): 重置索引,将索引恢复为默认的整数索引,并将原来的索引作为新的一列。
多重索引 (MultiIndex)
DataFrame 可以拥有多重索引,即行索引或列索引由多个层级组成。这在处理层次化数据时非常有用。
代码示例:
import pandas as pd data = {'姓名': ['Alice', 'Bob', 'Charlie', 'David'], '年龄': [25, 30, 28, 22], '城市': ['北京', '上海', '广州', '深圳'], '工资': [5000, 6000, 5500, 4800]} df = pd.DataFrame(data) # 将 '姓名' 列设置为索引 df = df.set_index('姓名') print(df) # 重置索引 df = df.reset_index() print(df) # 创建多重索引 index = pd.MultiIndex.from_tuples([('G1', 'A'), ('G1', 'B'), ('G2', 'A'), ('G2', 'B')], names=['Group', 'Letter']) df = pd.DataFrame({'col1': [1, 2, 3, 4], 'col2': [5, 6, 7, 8]}, index=index) print(df)
Pandas 会根据索引自动对齐数据,这使得不同 DataFrame 之间的操作变得非常方便。
代码示例:
import pandas as pd df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['X', 'Y', 'Z']) df2 = pd.DataFrame({'B': [7, 8, 9], 'C': [10, 11, 12]}, index=['Y', 'Z', 'W']) # 将两个 DataFrame 相加,Pandas 会自动对齐索引和列名 df3 = df1 + df2 print(df3)
输出:
A B C W NaN NaN NaN X NaN NaN NaN Y NaN 12.0 NaN Z NaN 14.0 NaN
可以看到,结果 DataFrame 中,只有索引和列名都相同的单元格才进行了相加,其他单元格的值为 NaN。
DataFrame 可以方便地进行可视化,利用 Pandas 内置的绘图功能或者结合 Matplotlib、Seaborn 等库。
代码示例:
import pandas as pd import matplotlib.pyplot as plt data = {'年份': [2018, 2019, 2020, 2021, 2022], '销量': [100, 120, 150, 130, 160]} df = pd.DataFrame(data) # 绘制折线图 df.plot(x='年份', y='销量', kind='line') plt.show() # 绘制柱状图 df.plot(x='年份', y='销量', kind='bar') plt.show()
DataFrame 在数据分析中扮演着核心角色,通常的数据处理流程如下:
DataFrame 是 Pandas 中最重要的数据结构,掌握 DataFrame 的创建、操作、索引、数据对齐和可视化是进行数据分析的关键。通过灵活运用 DataFrame,可以高效地处理和分析各种数据。