按整数索引选择一行pandas系列/ dataframe

时间:2013-04-19 03:14:00

标签: python pandas dataframe indexing

我很好奇为什么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 个答案:

答案 0 :(得分:465)

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

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

这里我们有新的运算符,.iloc表示只支持整数索引,而.loc表示只支持标签索引

e.g。想象一下这个场景

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

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

答案 1 :(得分:44)

DataFrame索引运算符的主要目的是[],用于选择列。

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

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

使用切片表示法时,DataFrame索引操作符完全更改行为以选择行

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

df[2:3]

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

df[6:20:3]

如果DataFrame索引中包含字符串,您还可以使用由字符串标签组成的切片。有关详细信息,请参阅this solution on .iloc vs .loc

我几乎从不使用索引运算符的切片表示法,因为它不明确且几乎没有使用过。按行切片时,请坚持使用.loc/.iloc

答案 2 :(得分:22)

您可以将DataFrame视为系列的词典。 df[key]尝试按key选择列索引并返回一个Series对象。

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

您可以阅读文档以获取详细信息:

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

答案 3 :(得分:13)

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

np_df = df.as_matrix()

然后

np_df[i] 

会起作用。

答案 4 :(得分:7)

您可以查看source code

DataFrame有一个私有函数_slice()来对DataFrame进行切片,它允许参数axis确定要切片的轴。 __getitem__()的{​​{1}}在调用DataFrame时未设置轴。因此_slice()默认情况下将其切片为轴0。

您可以进行一项简单的实验,这可能会对您有所帮助:

_slice()

答案 5 :(得分:6)

你可以像这样遍历数据框。

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

答案 6 :(得分:1)

我通常会按照 Ted 的建议选择 .loc/.iloc,但也可以通过转置 DataFrame 来选择一行。在上面的示例中,df.T[2] 为您提供 df 的第 2 行。