Python_AI库 Pandas的数据结构及基本操作
本文默认读者具备以下技能:
- 熟悉python基础知识,vscode或其它编辑工具
- 熟悉表格文件的基本操作
- 具备自主扩展学习能力
本文篇幅较长,但比较重要,希望读者可以认真看完并实例运行。
Pandas提供了两种主要的数据结构,它们分别是Series、DataFrame,它们都是建立在Numpy数组之上,因此运行速度很快。以下是对这三种数据结构的详细介绍:
-
Series:
- 一维带标签的同质数组,大小不可变。
- 可以将标量值、字典、列表等作为输入数据来创建Series对象。
- Series有一个标签,用于标识每个数据点,可以看作是数据的一维表示。
-
DataFrame(最常用的数据结构,要重点了解):
- 通用的二维带标签的表格结构,其中列的类型可能不同,大小可变。
- 可以从字典、列表、数组等创建DataFrame。
- DataFrame有行索引(index)和列索引(columns),可以方便地进行数据的选取、切片和聚合等操作。
- DataFrame是Pandas的核心数据结构,非常适合存储和处理表格型数据。
-
Panel(因结构复杂,使用少,已弃用,这里仅作扩展介绍,避免读者看到较早以前的教程时不理解):
- 通用的三维带标签的数组,大小可变。
- Panel可以看作是多个DataFrame的容器,用于处理三维数据。
- 由于其复杂性,Panel在实际应用中较少使用,通常可以通过其他方式(如多层索引的DataFrame)来处理三维数据。
Series的基本操作:
- 创建Series:
import pandas as pd
# 使用列表创建Series
s1 = pd.Series([1, 2, 3, 4, 5])
print(s1)
# 使用NumPy数组创建Series
import numpy as np
s2 = pd.Series(np.arange(10))
print(s2)
# 使用字典创建Series,字典的键将作为索引,值将作为数据
data = {'a': 1, 'b': 2, 'c': 3}
s3 = pd.Series(data)
print(s3)
- 访问与切片:
# 访问Series中的单个元素
print(s1[0]) # 使用位置索引访问第一个元素
print(s3['a']) # 使用标签索引访问键为'a'的元素
# 切片操作
sub_s1 = s1[1:4] # 访问第二个到第四个元素(不包含第四个)
print(sub_s1)
# 使用标签切片
sub_s3 = s3['a':'c'] # 访问键从'a'到'c'的元素(包含'a'和'c')
print(sub_s3)
- 索引操作:
# 查看Series的索引
print(s3.index)
# 重新设置Series的索引
s3.index = ['x', 'y', 'z']
print(s3)
- 数据操作:
# 对Series进行数学运算
s4 = s1 * 2 # 每个元素乘以2
print(s4)
# 对Series应用函数
s5 = s1.apply(lambda x: x**2) # 对每个元素求平方
print(s5)
# 计算统计量
mean_value = s1.mean() # 计算均值
std_dev = s1.std() # 计算标准差
print(f"Mean: {mean_value}, Std Dev: {std_dev}")
- 缺失数据处理:
# 创建一个包含缺失值的Series
s6 = pd.Series([1, 2, np.nan, 4, 5])
print(s6)
# 填充缺失值
s6_filled = s6.fillna(0) # 将缺失值替换为0
print(s6_filled)
# 判断元素是否为缺失值
is_missing = s6.isnull()
print(is_missing)
- 排序:
# 对Series进行排序
sorted_s3 = s3.sort_values() # 按值升序排序
print(sorted_s3)
sorted_s3_desc = s3.sort_values(ascending=False) # 按值降序排序
print(sorted_s3_desc)
- 唯一值与频率统计:
# 获取Series中的唯一值
unique_values = s1.unique()
print(unique_values)
# 统计每个唯一值出现的频率
value_counts = s1.value_counts()
print(value_counts)
以上的例子是Series数据结构的基本操作,包括创建、访问与切片、索引操作、数据操作、缺失数据处理、排序以及唯一值与频率统计等。Series作为Pandas的基础数据结构之一,提供了丰富的API来方便地进行数据处理和分析。通过结合这些基本操作,可以有效地处理和分析一维数据。
DataFrame的基本操作:
- 创建DataFrame:
import pandas as pd
# 使用字典列表创建DataFrame
data = [
{'Name': 'Alice', 'Age': 25, 'City': 'New York'},
{'Name': 'Bob', 'Age': 30, 'City': 'Paris'},
{'Name': 'Charlie', 'Age': 35, 'City': 'London'}
]
df = pd.DataFrame(data)
print(df)
# 使用二维数组或列表创建DataFrame
data_array = [
[1, 'A', 100],
[2, 'B', 200],
[3, 'C', 300]
]
columns = ['ID', 'Letter', 'Number']
df_array = pd.DataFrame(data_array, columns=columns)
print(df_array)
- 访问与切片:
# 访问列
names = df['Name']
print(names)
# 访问多列
subset = df[['Name', 'Age']]
print(subset)
# 访问行
first_row = df.iloc[0] # 使用整数位置索引
print(first_row)
# 访问特定单元格
age_bob = df.at[1, 'Age'] # 使用行标签和列名
print(age_bob)
# 切片操作
subset_df = df.iloc[1:3, [0, 2]] # 选择第二行到第三行(不包含第三行)的'Name'和'City'列
print(subset_df)
- 索引操作:
# 查看DataFrame的索引和列名
print(df.index)
print(df.columns)
# 重新设置DataFrame的索引
df.index = ['a', 'b', 'c']
print(df)
# 重命名列名
df.columns = ['FullName', 'AgeYears', 'ResidentCity']
print(df)
- 数据操作:
# 对DataFrame中的列进行数学运算
df['AgeSquared'] = df['Age'] ** 2 # 创建一个新列,值为'Age'列每个元素的平方
print(df)
# 对DataFrame应用函数
df['CityUpper'] = df['City'].str.upper() # 将'City'列中的每个元素转换为大写
print(df)
# 使用applymap对DataFrame中的每个元素应用函数
df_doubled = df.applymap(lambda x: x * 2 if isinstance(x, (int, float)) else x)
print(df_doubled)
# 计算每列的和、平均值等统计量
column_sums = df['Age'].sum()
column_mean = df['Age'].mean()
print(f"Sum of Age: {column_sums}, Mean of Age: {column_mean}")
- 数据筛选:
# 使用布尔索引筛选数据
young_people = df[df['Age'] < 30] # 选择年龄小于30的行
print(young_people)
# 使用query方法筛选数据
filtered_df = df.query("Age > 28 and City == 'New York'") # 选择年龄大于28且城市为'New York'的行
print(filtered_df)
# 使用loc和iloc结合标签和位置进行筛选
filtered_df_loc = df.loc[df['City'].isin(['Paris', 'London']), ['Name', 'Age']]
print(filtered_df_loc)
- 缺失数据处理:
# 创建一个包含缺失值的DataFrame
df_with_na = pd.DataFrame({
'A': [1, 2, np.nan],
'B': [5, np.nan, np.nan],
'C': [1, 2, 3]
})
print(df_with_na)
# 填充缺失值
df_filled = df_with_na.fillna(0) # 将缺失值替换为0
print(df_filled)
# 删除含有缺失值的行
df_dropped = df_with_na.dropna()
print(df_dropped)
- 排序:
单列排序:
假设我们有一个包含员工信息的DataFrame,我们想要按照“Salary”列对员工进行升序排序:
import pandas as pd
# 创建一个示例DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Salary': [50000, 60000, 45000, 55000]
}
df = pd.DataFrame(data)
# 按Salary列升序排序
sorted_df_asc = df.sort_values(by='Salary')
print(sorted_df_asc)
# 按Salary列降序排序
sorted_df_desc = df.sort_values(by='Salary', ascending=False)
print(sorted_df_desc)
多列排序:
有时我们可能希望先按照一列排序,然后在该列值相同的情况下按照另一列排序。例如,先按“Department”排序,再 按“Salary”排序:
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Department': ['HR', 'Engineering', 'Engineering', 'HR'],
'Salary': [50000, 65000, 60000, 55000]
}
df = pd.DataFrame(data)
# 先按Department列排序,再按Salary列升序排序
sorted_df_multi = df.sort_values(by=['Department', 'Salary'])
print(sorted_df_multi)
按照列名的字母顺序对列进行排序:
如果您想按照列名的字母顺序对DataFrame的列进行排序,可以使用sort_index()
方法,并通过参数axis=1
指定对列进行操作:
# 假设df是一个已经存在的DataFrame
sorted_columns_df = df.sort_index(axis=1)
print(sorted_columns_df)
以上例子中,sort_values()
方法用于对DataFrame的行进行排序,而sort_index()
方法则用于对行或列的索引进行排序。通过调整by
参数和ascending
参数,可以控制排序的列和排序的方向(升序或降序)。
请注意,这些排序操作不会改变原始DataFrame,而是返回一个新的排序后的DataFrame。如果希望直接修改原始DataFrame,可以使用inplace=True
参数,如df.sort_values(by='Salary', inplace=True)
。
series和dataframe数据结构使得Pandas在处理数据时非常灵活和高效,能够轻松地进行数据的清洗、转换、聚合和分析等操作。同时,Pandas还提供了大量的函数和方法,使得数据处理和分析变得更加简单和直观,这在后面的文章中会陆续介绍。