Pandas 是 Python 中用于数据分析的强劲工具库。本文将分享25个实用的 Pandas 技巧,这些技巧源自多年的教学经验,能够协助您更快地处理数据、编写更优雅的代码,并给同事留下深刻印象。以下内容将为您逐一介绍这些技巧,并附上相应的代码示例,助您快速上手。
1. 查看安装版本
在查阅 Pandas 文档时,了解当前使用的 Pandas 版本超级重大。您可以通过以下代码查看 Pandas 的版本号:
import pandas as pd
print(pd.__version__)
如果需要查看 Pandas 的依赖库版本(如 Python、NumPy、Matplotlib 等),可以使用 show_versions 函数:
pd.show_versions()
2. 创建示例 DataFrame
在演示 Pandas 代码时,常常需要一个示例 DataFrame。最简单的方法是将字典传递给 DataFrame 构造函数,其中字典的键是列名,值是列数据的列表:
import pandas as pd
df = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']})
如果需要创建更大的 DataFrame,手动输入数据会过于繁琐。此时,可以使用 NumPy 的 random.rand 函数生成随机数据,并指定行数和列数:
import numpy as np
df = pd.DataFrame(np.random.rand(4, 3))
若需为列指定非数字名称,可以将字符串转换为字符列表并传递给 columns 参数:
df = pd.DataFrame(np.random.rand(4, 3), columns=list('abc'))
3. 重命名列
假设您有一个包含空格的列名 DataFrame,这会影响使用点号选择列的便利性。以下是几种重命名列的方法。最灵活的方式是使用 rename 方法,通过字典指定旧名称和新名称:
df = df.rename(columns={'old name': 'new_name'}, axis=1)
如果需要一次性重命名所有列,可以直接覆盖 columns 属性:
df.columns = ['new_col1', 'new_col2', 'new_col3']
若仅需将列名中的空格替换为下划线,可使用 str.replace 方法:
df.columns = df.columns.str.replace(' ', '_')
若需为所有列名添加前缀或后缀,可使用 add_prefix 或 add_suffix 方法:
df = df.add_prefix('pre_')
df = df.add_suffix('_suf')
4. 反转行顺序
对于一个记录各国平均酒精消费量的 DataFrame,若需反转行顺序,可使用 loc 访问器和 Python 列表反转的切片语法:
df = df.loc[::-1]
若还需重置索引为从零开始的整数索引,可结合 reset_index 方法:
df = df.loc[::-1].reset_index(drop=True)
5. 反转列顺序
类似地,您可以使用 loc 反转列的左右顺序:
df = df.loc[:, ::-1]
6. 根据数据类型选择列
假设您有一个 DataFrame,需要仅选择数值型列,可以使用 select_dtypes 方法:
numeric_df = df.select_dtypes(include=['int64', 'float64'])
也可以选择其他数据类型(如对象类型)或排除特定类型:
object_df = df.select_dtypes(include='object')
exclude_df = df.select_dtypes(exclude=['int64'])
7. 将字符串转换为数字
当列数据以字符串形式存储时(例如包含破折号表明零),需要将其转换为数值型以进行数学运算。可以使用 astype 方法转换前两列:
df[['col1', 'col2']] = df[['col1', 'col2']].astype(float)
对于包含无效输入的列(如破折号),使用 to_numeric 函数并将无效值转换为 NaN:
df['col3'] = pd.to_numeric(df['col3'], errors='coerce')
若 NaN 表明零,可用 fillna 填充:
df['col3'] = pd.to_numeric(df['col3'], errors='coerce').fillna(0)
对整个 DataFrame 应用转换,可使用 apply 方法:
df = df.apply(pd.to_numeric, errors='coerce').fillna(0)
8. 减少 DataFrame 内存占用
Pandas DataFrame 一般需要加载到内存中,因此有时需要优化其大小。查看 DataFrame 大小:
df.memory_usage(deep=True).sum() / 1024 # 以 KB 为单位
在读取文件时,可通过 usecols 参数仅加载所需列:
df = pd.read_csv('file.csv', usecols=['col1', 'col2'])
对于包含分类数据的对象列,可将其转换为 category 类型以减少内存占用:
df = pd.read_csv('file.csv', dtype={'continent': 'category'})
9. 从多个文件行向构建 DataFrame
当数据集分散在多个文件中时,可以使用 glob 模块和 concat 函数将其合并为单个 DataFrame:
from glob import glob
files = sorted(glob('data/stocks*.csv'))
df = pd.concat((pd.read_csv(f) for f in files), ignore_index=True)
10. 从多个文件列向构建 DataFrame
若每个文件包含数据集的不同列,可沿列轴合并:
files = sorted(glob('data/drinks*.csv'))
df = pd.concat((pd.read_csv(f) for f in files), axis=1)
11. 从剪贴板创建 DataFrame
从 Excel 或 Google Sheet 复制数据后,可使用 read_clipboard 函数直接创建 DataFrame:
df = pd.read_clipboard()
12. 将 DataFrame 随机拆分为两个子集
若需将 DataFrame 随机拆分为 75% 和 25% 两个子集,可使用 sample 和 drop 方法:
movies_1 = df.sample(frac=0.75, random_state=42)
movies_2 = df.drop(movies_1.index)
13. 按多个类别过滤 DataFrame
要过滤特定类别的行(如电影类型的“动作片”、“剧情片”或“西部片”),可使用 isin 方法:
df = df[df['genre'].isin(['Action', 'Drama', 'Western'])]
排除这些类别可使用“非”运算符 ~:
df = df[~df['genre'].isin(['Action', 'Drama', 'Western'])]
14. 按最大类别过滤 DataFrame
若需保留最大三个类别的行,可结合 value_counts 和 nlargest 方法:
counts = df['genre'].value_counts()
top_genres = counts.nlargest(3).index
df = df[df['genre'].isin(top_genres)]
15. 处理缺失值
检查每列缺失值数量:
df.isna().sum()
计算缺失值比例:
df.isna().mean()
删除包含缺失值的列:
df = df.dropna(axis=1)
仅保留缺失值少于 10% 的列:
df = df.dropna(axis=1, thresh=int(0.9 * len(df)))
16个:将字符串拆分为多列
假设我们有一个 DataFrame,其中包含一个“姓名”列,需要将其拆分为名字、中间名和姓氏三个单独的列。可以使用 str.split 方法,将字符串按空格分割并扩展为 DataFrame:
df[['first', 'middle', 'last']] = df['name'].str.split(' ', expand=True)
如果我们有一个“位置”列(例如包含“城市, 州”格式的数据),并且只想保留城市名称,可以在拆分后选择第一列(索引为0)并保存到 DataFrame 中:
df['city'] = df['location'].str.split(', ', expand=True)[0]
17. 将列表列扩展为 DataFrame
若 DataFrame 某列包含 Python 列表,可使用 apply 和 Series 构造函数扩展为新 DataFrame:
new_df = df['list_col'].apply(pd.Series)
df = pd.concat([df, new_df], axis=1)
18. 使用多个函数进行聚合
对于订单数据,可按订单 ID 聚合并计算总价和项目数量:
result = df.groupby('order_id')['item_price'].agg(['sum', 'count'])
19. 将聚合结果与 DataFrame 合并
若需在每行中添加订单总价,可使用 transform 方法:
df['total_price'] = df.groupby('order_id')['item_price'].transform('sum')
20. 选择行和列的切片
对于泰坦尼克号数据集,可使用 loc 选择特定的行和列:
summary = df.describe().loc['min':'max', 'age':'fare']
21. 重塑多重索引 Series
将多重索引 Series 重塑为 DataFrame:
survival_rate = df.groupby(['sex', 'pclass'])['survived'].mean().unstack()
22. 创建透视表
使用 pivot_table 创建透视表,并添加行和列的总数:
pivot = df.pivot_table(index='sex', columns='pclass', values='survived', aggfunc='mean', margins=True)
23. 将连续数据转换为分类数据
将年龄列转换为分类数据:
df['age_group'] = pd.cut(df['age'], bins=[0, 18, 25, 99], labels=['child', 'young adult', 'adult'])
24. 更改显示选项
标准化小数位显示:
pd.set_option('display.float_format', '{:.2f}'.format)
25. 样式化 DataFrame
为 DataFrame 应用格式和样式:
format_dict = {'Date': '{:%m-%d-%Y}', 'Close': '${:.2f}', 'Volume': '{:,}'}
styled_df = df.style.format(format_dict).hide_index().highlight_min('Close', color='red').highlight_max('Close', color='green').background_gradient(subset=['Volume']).set_caption('Stock Data')
额外技巧:分析 DataFrame并生成报告
使用 pandas-profiling 包快速生成数据分析报告:
from pandas_profiling import ProfileReport
report = ProfileReport(df)
report.to_file('report.html')


确实不错
牛掰
收藏了,感谢分享
谢谢!