我想根据掩码 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 Data是 pandas
的基础:阅读官方文档是无可替代的。
关于python - 使用 pandas 建立索引的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50662176/