157

我有一个dataframe df

20060930  10.103       NaN     10.103   7.981
20061231  15.915       NaN     15.915  12.686
20070331   3.196       NaN      3.196   2.710
20070630   7.907       NaN      7.907   6.459

然后我想选择列表中指示的具有某些序列号的行,假设这里是[1,3],然后离开:

20061231  15.915       NaN     15.915  12.686
20070630   7.907       NaN      7.907   6.459

如何或什么功能可以做到这一点?

4

6 回答 6

189
ind_list = [1, 3]
df.ix[ind_list]

应该做的伎俩!当我使用数据框进行索引时,我总是使用 .ix() 方法。它更容易,更灵活......

更新 这不再是公认的索引方法。该ix方法已弃用。用于.iloc基于整数的索引和.loc基于标签的索引。请参见下面的示例:

ind_list = [1, 3]
df.iloc[ind_list]
于 2013-10-03T09:43:39.327 回答
128

您还可以使用 iloc:

df.iloc[[1,3],:]

如果您的数据框中的索引由于先前的计算而与行的顺序不对应,这将不起作用。在这种情况下使用:

df.index.isin([1,3])

...正如其他回复中所建议的那样。

于 2013-10-10T12:17:42.677 回答
89

另一种方式(虽然它是一个较长的代码)但它比上述代码更快。使用 %timeit 函数检查它:

df[df.index.isin([1,3])]

PS:你找出原因

在此处输入图像描述

于 2019-01-08T11:14:41.093 回答
13

如果index_list包含您想要的索引,您可以通过执行获取具有所需行的数据框

index_list = [1,2,3,4,5,6]
df.loc[df.index[index_list]]

这是基于截至 2021 年 3 月的最新文档。

于 2021-03-11T09:13:10.110 回答
5

对于大型数据集,通过skiprows参数仅读取选定的行会提高内存效率。

例子

pred = lambda x: x not in [1, 3]
pd.read_csv("data.csv", skiprows=pred, index_col=0, names=...)

现在,这将从跳过除 1 和 3 之外的所有行的文件中返回 DataFrame。


细节

文档

skiprows:类列表或整数或可调用,默认None

...

如果可调用,可调用函数将根据行索引进行评估,如果应该跳过该行,则返回 True,否则返回 False。一个有效的可调用参数的例子是lambda x: x in [0, 2]

此功能适用于 pandas 0.20.0+ 版本。另请参阅相应问题相关帖子

于 2018-06-20T18:13:00.900 回答
2

解决这个问题的方法有很多,上面列出的就是最常用的解决方法。我想再添加两种方法,以防万一有人在寻找替代方法。

index_list = [1,3]

df.take(pos)

#or

df.query('index in @index_list')
于 2020-11-05T03:05:56.100 回答