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)
不,它们不一样。一种使用直接语法,而另一种依赖于链式索引。
关键点是:
pd.DataFrame.iloc 主要用于基于整数位置的索引。pd.DataFrame.loc 最常用于标签或布尔数组。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:阅读官方文档是无可替代的。