通过整数索引选择一行pandas系列/数据帧

我很好奇为什么不支持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索引约定一致。是否有设计原因不支持按单个整数索引行?

1160884 次浏览

你可以把DataFrame看作一个系列字典。df[key]尝试通过key选择列索引并返回一个Series对象。

但是,在[]内部进行切片将对行进行切片,因为这是一种非常常见的操作。

你可以阅读文件的详细信息:

基本< a href = " http://pandas.pydata.org/pandas-docs/stable/indexing.html " > http://pandas.pydata.org/pandas-docs/stable/indexing.html基础< / >

你可以看看源代码

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)

@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

[]只对行进行切片(根据标签位置)

你可以像这样循环数据帧。

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

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

np_df = df.as_matrix()

然后

np_df[i]

是可行的。

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

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

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


当使用切片表示法时,DataFrame索引操作符完全改变了选择行的行为

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

df[2:3]

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

df[6:20:3]

如果你的DataFrame索引中有字符串,你也可以使用由字符串标签组成的切片。有关更多详细信息,请参见.iloc vs .loc的解决方案

我几乎从不使用这个切片符号和索引操作符,因为它不是显式的,几乎没有使用过。当按行切片时,坚持使用.loc/.iloc

我通常会按照Ted的建议使用.loc/.iloc,但也可以通过调换DataFrame来选择一行。为了保持上面的示例,df.T[2]给出了df的第2行。

如果你想通过它们的整数索引来索引多个行,使用一个索引列表:

idx = [2,3,1]
df.iloc[idx]

注意:如果idx是使用一些规则创建的,那么你也可以使用.iloc(或.loc)对数据帧进行排序,因为输出将按idx排序。因此,在某种意义上,iloc可以充当一个排序函数,其中idx是排序键。