python - 使用 pandas 建立索引的最佳实践

标签 python pandas dataframe indexing series

我想根据掩码 idx 选择行。我可以想到两种不同的可能性,要么使用 iloc,要么只使用括号。我在下面展示了两种可能性(在数据框 df 上)。它们是否同样可行?

idx = (df["timestamp"] >= 5) & (df["timestamp"] <= 10)
idx = idx.values
hr = df["hr"].iloc[idx]
timestamps = df["timestamp"].iloc[idx]

或以下:

idx = (df["timestamp"] >= 5) & (df["timestamp"] <= 10)
hr = df["hr"][idx]
timestamps = df["timestamp"][idx]

最佳答案

不,它们不一样。一个使用直接语法,而另一个依赖链式索引。

关键点是:

  • pd.DataFrame.iloc主要用于基于整数位置的索引。
  • pd.DataFrame.loc最常与标签或 bool 数组一起使用。
  • 链式索引,即通过 df[x][y],是 explicitly discouraged并且从来没有必要。
  • idx.values 返回 idx 系列的 numpy 数组表示。这不能喂.iloc,也不需要喂.loc,可以直接取idx

下面是两个可行的示例。在任一示例中,您都可以使用类似的语法来屏蔽数据框或系列。例如,df['hr'].loc[mask]df.loc[mask] 一样有效。

伊洛克

这里我们使用 numpy.where 来提取 bool 系列中 True 元素的整数索引。 iloc 确实接受 bool 数组,但在我看来,这不太清楚; "i"代表整数。

idx = (df['timestamp'] >= 5) & (df['timestamp'] <= 10)
mask = np.where(idx)[0]
df = df.iloc[mask]

地点

当我们已经按特定系列进行查询时,使用 loc 会更自然。

mask = (df['timestamp'] >= 5) & (df['timestamp'] <= 10)
df = df.loc[mask]
  • 当仅屏蔽行时,您可以完全省略 loc 访问器并使用 df[mask]
  • 如果按行屏蔽并过滤列,您可以使用 df.loc[mask, 'col_name']

Indexing and Selecting Datapandas 的基础:阅读官方文档是无可替代的。

关于python - 使用 pandas 建立索引的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50662176/

相关文章:

python - 在提交期间删除错误查询

python - 计算迭代器的产量数?

python - 为什么flask中的GET请求被调用了两次?

Python Enthought 32 与 64 位版本

python - 检查输入 : expected conv2d_input to have 4 dimensions, 但获得形状为 (28708, 1) 的数组时出错

python - 何时使用 iloc 和 loc 作为 bool 值

python - Pandas 数据帧 to_sql 数据长度超过 65536 个字符

python - 从键值对替换数据帧中的子字符串的最快方法

python - Pandas to_excel 在空白电子表格中写入数据框结果 - 如何使用 xlwt 写入 excel?

python - 从 pandas DataFrame 中的列中减去平均值