根据列表索引选择 Pandas 行

我有一个 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

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

334178 次浏览

对于基于整数的索引使用 .iloc,对于基于标签的索引使用 .loc:

ind_list = [1, 3]
df.iloc[ind_list]

你也可以使用 iloc:

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

如果由于之前的计算,数据框中的索引不符合行的顺序,那么这将不起作用。在这种情况下,使用:

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

正如其他回答所暗示的那样。

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

例子

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

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


细节

来自 医生:

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

...

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

这个特性适用于0.20.0以上版本的熊猫。参见 相应的问题相关职位

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

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

附言: 你找出原因

enter image description here

有许多方法可以解决这个问题,上面列出的方法是最常用的解决方法。我想再加两种方法,以防有人想找别的方法。

index_list = [1,3]


df.take(pos)


#or


df.query('index in @index_list')

如果 index_list包含所需的索引,则可以通过执行

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

这是基于2021年3月的最新 文件

您正在尝试做的是根据索引过滤数据框架。目前在熊猫身上做到这一点的最佳方法如下:

单一指数

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

多索引

desired_index_list = [1,3]
index_level_to_filter = 0
df[df.index.get_level_values(index_level_to_filter).isin(desired_index_list)]

从筛选的索引中获取新的 DataFrame:

对于我的问题,我需要一个来自索引的新数据框架:

iloc_list=[1,2,4,8]
df_new = df.filter(items = iloc_list , axis=0)

您也可以使用此方法筛选列。请参阅 文件了解详细信息。