pandas根据整数索引select一行dataframe

我很好奇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]: ABCD 2000-01-03 1.02768 1.51421 -1.466963 -0.162339 

我希望df[2]的工作方式与df[2:3] ,以符合Python索引约定。 有没有支持单个整数索引行的devise理由?

回声@HYRY,请参阅0.11中的新文档

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

这里我们有新的操作符, .iloc只支持整数索引, .loc只支持标签索引

例如想象这种情况

 In [1]: df = DataFrame(randn(5,2),index=range(0,10,2),columns=list('AB')) In [2]: df Out[2]: AB 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]: AB 4 -0.284561 0.756029 In [6]: df.loc[[2]] Out[6]: AB 2 -0.470056 1.192211 

[]仅对行进行切片(按标签位置)

您可以将DataFrame视为Series的一个字典。 df[key]尝试df[key]select列索引并返回一个Series对象。

然而,在[]切片内切片行,因为这是一个非常常见的操作。

你可以阅读文件的细节:

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

要对基于索引的pandas表进行访问,还可以考虑使用numpy.as_array选项将表转换为Numpy数组

 np_df = df.as_matrix() 

接着

 np_df[i] 

会工作。

你可以看看源代码 。

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) 

你可以像这样循环访问数据框。

 for ad in range(1,dataframe_c.size): print(dataframe_c.values[ad]) 

DataFrame索引操作符[]的主要用途是select列。

当索引运算符传递一个string或整数时,它将尝试查找具有该特定名称的列,并将其作为一个Series返回。

所以,在上面的问题中: df[2]search匹配整数值2的列名称。 此列不存在,并引发KeyError


DataFrame索引操作符完全改变行为,以便在使用切片符号时select行

奇怪的是,当给定一个分片时,DataFrame索引操作符select行,并且可以通过整数位置或索引标签来完成。

 df[2:3] 

这将从具有整数位置2的行开始切片到3,不包括最后一个元素。 所以,只有一行。 以下select从整数位置6开始直到但不包括每第三行20的行。

 df[6:20:3] 

如果DataFrame索引中包含string,也可以使用由string标签组成的切片。 有关更多详细信息,请参阅.iloc vs .loc上的此解决scheme 。

我几乎从不使用索引运算符的这种切片符号,因为它不明确,也很less使用。 按行切片时,请使用.loc/.iloc