Pandas DataFrame Python:构建和过滤行

使用pd.DataFrame(data)在Python中创建pandas DataFrame,传入由等长列表组成的字典作为列和值。当记录需要带标签的行和列、列选择或向量化过滤时,请使用DataFrame。布尔掩码无需编写Python循环即可过滤表格数据。除非显式重置,否则结果保留原始索引标签。

Python Pandas DataFrame行过滤示例

输出:

输出将显示在这里...

输出:

product  units
Keyboard     12
 Monitor     15

示例工作原理

  1. import pandas as pd为包赋予其惯用的pd别名。
  2. pandas DataFrame构造函数将每个字典键转换为列标签。由于两个列表都包含三个值,pandas创建三行并分配包含012的默认RangeIndex
  3. sales["units"] >= 10生成与该索引对齐的布尔Series。将掩码传回sales[...]只保留值为True的行。
  4. to_string(index=False)隐藏打印表中的索引;它不会删除或重新编号已存储的标签。

证明DataFrame运行实际做了什么

在同一页面运行两次程序,每次完成后打开Run Details。这将面板变成依赖关系实验,而不是将冷启动时间误认为DataFrame基准测试。

观察冷启动运行时同页面热运行时
Requests00
新增可用包pandas 1.5.3, numpy 1.26.1, python-dateutil 2.8.2, six 1.16.0, pytz 2023.30
变化内容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迭代时,使用字典列表。