使用 Pandas 建立索引的最佳实践

mac*_*ery 3 python indexing series dataframe pandas

我想根据掩码选择行,idx. 我可以想到两种不同的可能性,使用iloc或仅使用括号。我在下面展示了两种可能性(在数据框上df)。他们都同样可行吗?

idx = (df["timestamp"] >= 5) & (df["timestamp"] <= 10)
idx = idx.values
hr = df["hr"].iloc[idx]
timestamps = df["timestamp"].iloc[idx]
Run Code Online (Sandbox Code Playgroud)

或以下之一:

idx = (df["timestamp"] >= 5) & (df["timestamp"] <= 10)
hr = df["hr"][idx]
timestamps = df["timestamp"][idx]
Run Code Online (Sandbox Code Playgroud)

jpp*_*jpp 8

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

关键点是:

  • pd.DataFrame.iloc 主要用于基于整数位置的索引。
  • pd.DataFrame.loc 最常用于标签或布尔数组。
  • 链式索引,即 via df[x][y],是明确不鼓励的,而且从来没有必要。
  • idx.values返回系列的numpy数组表示idx。这个不能喂.iloc也没有必要喂.loc,可以idx直接吃。

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

国际劳工组织

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

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

位置

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

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

索引和选择数据是基础pandas:阅读官方文档是无可替代的。