pandas 是 Python 中非常强大的数据处理和分析库,广泛应用于数据清洗、数据分析和数据可视化等领域。它的主要数据结构是 Series(一维数组)和 DataFrame(二维数据表),提供了丰富的功能来处理各种格式的数据,pandas 是数据分析和处理的核心工具,掌握它的基本操作及优化技巧能大大提升工作效率。
1. pandas 基础概念
Series
Series 是 pandas 的一维数组,类似于 Python 中的列表,但它可以附带标签(索引),用于标识每个元素。
import pandas as pd# 创建 Series
data = [10, 20, 30, 40]
index = ['a', 'b', 'c', 'd']
series = pd.Series(data, index=index)print(series)输出:a 10
b 20
c 30
d 40
dtype: int64
DataFrame
DataFrame 是 pandas 中的二维数据结构,类似于一个表格,拥有行和列,能够保存不同类型的数据。
# 创建 DataFrame
data = {'name': ['Alice', 'Bob', 'Charlie'],'age': [25, 30, 35],'city': ['New York', 'Los Angeles', 'Chicago']
}
df = pd.DataFrame(data)print(df)输出:name age city
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
2. pandas 核心操作
索引和切片
使用 loc[] 和 iloc[] 进行数据的访问。
• loc[]: 基于标签(索引名)进行访问
• iloc[]: 基于位置(索引位置)进行访问
# 使用 loc[] 根据标签进行访问
print(df.loc[0]) # 访问第一行数据(通过标签)# 使用 iloc[] 根据位置进行访问
print(df.iloc[1]) # 访问第二行数据(通过位置)
添加、删除列和行
• df['new_column'] = ...:添加列
• df.drop(...):删除行或列
# 添加新列
df['salary'] = [50000, 60000, 70000]
print(df)
# 删除列
df = df.drop(columns=['salary'])
print(df)
# 删除行
df = df.drop(index=1)
print(df)
数据筛选
通过条件筛选数据:
# 根据条件筛选数据
filtered_df = df[df['age'] > 30]
print(filtered_df)
数据排序
sort_values() 用于对数据进行排序。
# 根据某一列排序
df_sorted = df.sort_values(by='age', ascending=False)
print(df_sorted)
- pandas 数据清洗
缺失值处理
• isna() / notna():检查缺失值
• fillna():填充缺失值
• dropna():删除缺失值
# 创建包含缺失值的 DataFrame
df_with_na = pd.DataFrame({'name': ['Alice', 'Bob', None],'age': [25, None, 35],'city': ['New York', 'Los Angeles', 'Chicago']
})
# 检查缺失值
print(df_with_na.isna())
# 填充缺失值
df_filled = df_with_na.fillna({'name': 'Unknown', 'age': df_with_na['age'].mean()})
print(df_filled)
# 删除缺失值
df_dropped = df_with_na.dropna()
print(df_dropped)
重复数据处理
• duplicated():检查重复行
• drop_duplicates():删除重复行
# 创建包含重复数据的 DataFrame
df_with_duplicates = pd.DataFrame({'name': ['Alice', 'Bob', 'Alice', 'Charlie'],'age': [25, 30, 25, 35],
})
# 检查重复行
print(df_with_duplicates.duplicated())
# 删除重复行
df_no_duplicates = df_with_duplicates.drop_duplicates()
print(df_no_duplicates)
4. pandas 聚合与分组
groupby
groupby 是 pandas 中强大的数据聚合工具。你可以按一个或多个列对数据进行分组,并对每个组应用聚合操作,如计算总和、均值等。
# 按 'city' 列分组并计算每组的平均年龄
grouped = df.groupby('city')['age'].mean()
print(grouped)
# 多列分组
grouped_multiple = df.groupby(['city', 'age']).size()
print(grouped_multiple)
聚合函数
可以使用 agg() 函数来进行更复杂的聚合操作。
# 使用 agg() 进行多种聚合
agg_result = df.groupby('city').agg({'age': 'mean', 'salary': 'sum'})
print(agg_result)
5. pandas 数据导入导出
读取文件
• read_csv():读取 CSV 文件
• read_excel():读取 Excel 文件
• read_sql():从 SQL 数据库读取数据
# 读取 CSV 文件
df_csv = pd.read_csv('file.csv')
# 读取 Excel 文件
df_excel = pd.read_excel('file.xlsx')
保存文件
• to_csv():保存为 CSV 文件
• to_excel():保存为 Excel 文件
# 保存 DataFrame 为 CSV 文件
df.to_csv('output.csv', index=False)
# 保存 DataFrame 为 Excel 文件
df.to_excel('output.xlsx', index=False)
- pandas 高级功能
合并与连接
• merge():根据某一列或多列进行合并
• concat():按行或列拼接多个 DataFrame
# 合并 DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['A', 'B', 'D'], 'value': [4, 5, 6]})
merged_df = pd.merge(df1, df2, on=‘key’, how=‘inner’) # 内连接
print(merged_df)
# 拼接 DataFrame
concatenated_df = pd.concat([df1, df2], axis=0) # 按行拼接
print(concatenated_df)
透视表与交叉表
• pivot_table():创建透视表
• crosstab():创建交叉表
# 透视表
pivot_table = df.pivot_table(values='age', index='city', aggfunc='mean')
print(pivot_table)
# 交叉表
crosstab_result = pd.crosstab(df['city'], df['age'])
print(crosstab_result)
7. pandas 使用注意事项
性能优化
• 避免使用 for 循环:尽量避免使用 for 循环逐行处理 DataFrame,而是利用 pandas 内置的向量化操作。
# 推荐:向量化操作
df['age'] = df['age'] + 1
# 不推荐:使用循环
for index, row in df.iterrows():df.at[index, 'age'] = row['age'] + 1
• 避免使用 apply():虽然 apply() 可以实现自定义函数,但它比向量化操作慢,应尽量避免使用。
内存管理
• pandas 对内存的消耗较大,特别是在处理大量数据时。可以使用 dtype 参数来优化内存占用。
# 优化内存占用
df = pd.read_csv('file.csv', dtype={'age': 'int32', 'salary': 'float32'})
日期时间处理
• pandas 在处理日期和时间时非常强大,可以使用 pd.to_datetime() 来转换日期,使用 .dt 提取日期时间的各个部分。
# 转换为日期格式
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
# 提取日期的年、月、日
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
总结