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
。