Pandas DataFrame Python:构建和过滤行
使用pd.DataFrame(data)在Python中创建pandas DataFrame,传入由等长列表组成的字典作为列和值。当记录需要带标签的行和列、列选择或向量化过滤时,请使用DataFrame。布尔掩码无需编写Python循环即可过滤表格数据。除非显式重置,否则结果保留原始索引标签。
Python Pandas DataFrame行过滤示例
输出:
输出将显示在这里...
输出:
product units
Keyboard 12
Monitor 15
示例工作原理
import pandas as pd为包赋予其惯用的pd别名。- pandas DataFrame构造函数将每个字典键转换为列标签。由于两个列表都包含三个值,pandas创建三行并分配包含
0、1和2的默认RangeIndex。 sales["units"] >= 10生成与该索引对齐的布尔Series。将掩码传回sales[...]只保留值为True的行。to_string(index=False)隐藏打印表中的索引;它不会删除或重新编号已存储的标签。
证明DataFrame运行实际做了什么
在同一页面运行两次程序,每次完成后打开Run Details。这将面板变成依赖关系实验,而不是将冷启动时间误认为DataFrame基准测试。
| 观察 | 冷启动运行时 | 同页面热运行时 |
|---|---|---|
| Requests | 0 | 0 |
| 新增可用包 | pandas 1.5.3, numpy 1.26.1, python-dateutil 2.8.2, six 1.16.0, pytz 2023.3 | 0 |
| 变化内容 | pandas及其依赖项变得可用 | 运行时已有这些包 |
web.run检测到import pandas并在用户的Python启动前加载支持的包。Run Details报告该次运行前后可用包的差异,因此热运行的Packages列表为空意味着”没有新加载任何内容”,而不是”pandas未被使用”。
第一次运行的总时间包括包引导和Python执行。在责怪pd.DataFrame(...)之前,请与热运行进行比较;时间因机器和缓存状态而异,因此使用Packages列表来识别引导工作。
两次运行都报告零个用户请求,因为字典和过滤保持在本地。冷启动仍作为运行时活动下载包文件。因此,“无用户请求”证明代码片段没有发出外部请求,而不是浏览器传输了零字节。
过滤索引陷阱:loc不是iloc
过滤保留标签。此处ready.index.tolist()为[0, 2],尽管index=False使输出看起来像一个新的两行表格。将第二个显示行视为标签1的代码会失败:
错误示例:
second_product = ready.loc[1, "product"] # KeyError: 1
按位置获取第二行的正确方法:
second_product = ready.iloc[1]["product"]
当后续代码需要连续标签时的正确方法:
ready = ready.reset_index(drop=True)
second_product = ready.loc[1, "product"]
对索引标签使用.loc,对从零开始的位置使用.iloc。仅当新标签是预期结果的一部分时才重置索引;否则保留源标签有助于将过滤后的行追溯到原始数据。
DataFrame构造函数长度错误
列表字典必须描述一个矩形表格。pandas会抛出ValueError: All arrays must be of the same length,而不是猜测如何填充较短的列。
错误示例:
pd.DataFrame({"product": ["Keyboard", "Mouse"], "units": [12]})
正确示例:
pd.DataFrame({"product": ["Keyboard", "Mouse"], "units": [12, None]})
只有当缺失值真实地代表数据时才添加显式缺失值;否则在构建表格之前修复源记录。
DataFrame是正确容器的时机
| 选择 | 适用场景 |
|---|---|
| DataFrame | 多个带标签的列需要布尔索引、列操作或表格分析 |
| Series | 一个带标签的维度就够了 |
| 字典列表 | 小型记录集合需要迭代但不需要列操作 |
| NumPy数组 | 同质数值数据需要不带行或列标签的矩阵运算 |
当标签和向量化操作简化了实际转换时,DataFrame就值得其包和内存开销。当记录较小且只需要普通Python迭代时,使用字典列表。