通过整数索引选择Pandas系列/数据框的一行

569

我很好奇为什么不支持df [2],而df.ix [2]df [2:3]都可以使用。

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

我希望df[2]的工作方式与df[2:3]相同,以保持一致性Python索引约定。是否有不支持单个整数索引行的设计原因?


7
Õ£©pandas version '0.19.2'õĖŁ’╝īdf.ix[2]õĖŹĶāĮµŁŻÕĖĖÕĘźõĮ£ŃĆé - Zahra
8个回答

786

回应 @HYRY,可以查看0.11版本的新文档

http://pandas.pydata.org/pandas-docs/stable/indexing.html

现在我们有了新的运算符,.iloc 明确支持仅整数索引,.loc 明确支持仅标签索引

例如,请想象这种情况

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[]只能按标签位置切片行。


117

DataFrame索引操作符[]的主要目的是选择列。

当索引操作符传递一个字符串或整数时,它会尝试找到具有该特定名称的列并将其作为Series返回。

因此,在上面的问题中:df[2]搜索与整数值2匹配的列名。由于该列不存在,会引发一个KeyError异常。


当使用切片符号时,DataFrame索引操作符的行为完全改变以选择行。

奇怪的是,当给出一个切片时,DataFrame索引操作符会选择行,并且可以通过整数位置或索引标签进行选择。

df[2:3]

这将从整数位置为2的行开始切片,一直到3(不包括最后一个元素),因此只有一行。以下内容选择从整数位置6开始的行,每隔三行选取一行,直到但不包括第20行。

df[6:20:3]

如果你的DataFrame索引中包含字符串,你也可以使用由字符串标签组成的切片。有关更多详细信息,请参见这个关于.iloc和.loc的解释

当按行切片时,我几乎从不使用索引运算符的切片符号,因为它不够明确且很少使用。请坚持使用.loc/.iloc进行行切片。


32
你可以将DataFrame看作一组Series的字典。df[key]会尝试通过key选择列索引,并返回一个Series对象。
然而,在[]中进行切片将会对行进行切片,因为这是一种常见的操作。
你可以阅读文档获得更详细的信息:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


字典的概念在迭代groupby对象时特别有帮助。很高兴能将它们统一起来。谢谢! - jtlz2

16

为了通过索引访问pandas表,我们也可以考虑使用 numpy.as_array 选项将表格转换为Numpy数组。

np_df = df.as_matrix()

然后

np_df[i] 

会起作用。


21
这翻译的内容是:这将完全违背DataFrame索引和Pandas提供的其他所有功能的初衷。 - Fábio Dias

7
你可以像这样遍历数据框。
for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])

7
您可以查看源代码DataFrame有一个私有函数_slice()用于切片DataFrame,它允许参数axis确定要切片的轴。DataFrame__getitem__()在调用_slice()时不设置轴。因此,默认情况下_slice()将按轴0进行切片。
您可以进行一个简单的实验,这可能会帮助您:
print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

3

通常我会选择像Ted建议的.loc/.iloc,但是你也可以通过转置DataFrame来选择一行。 以以上示例为例,df.T[2]会给出df中第2行。


2
如果您想按其整数索引对多行进行索引,请使用索引列表:
idx = [2,3,1]
df.iloc[idx]

注意:如果 idx 是按照某个规则创建的,则您还可以通过使用 .iloc(或 .loc)对数据框进行排序,因为输出将按照 idx 排序。因此,在某种意义上,iloc 可以像排序函数一样运行,其中 idx 是排序键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接