518

我很好奇为什么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

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

4

7 回答 7

720

呼应@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

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

于 2013-04-19T12:20:25.803 回答
95

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

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

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


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

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

df[2:3]

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

df[6:20:3]

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

我几乎从不将这种切片符号与索引运算符一起使用,因为它不明确且几乎从未使用过。按行切片时,坚持使用.loc/.iloc.

于 2017-10-24T21:37:07.590 回答
28

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

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

您可以阅读文档以了解详细信息:

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

于 2013-04-19T07:33:32.307 回答
16

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

np_df = df.as_matrix()

进而

np_df[i] 

会工作。

于 2016-05-23T06:53:06.950 回答
7

你可以看看源代码

DataFrame有一个私有函数_slice()来对 进行切片DataFrame,它允许参数axis确定要切片的轴。__getitem__()for调用时DataFrame不设置轴。_slice()因此_slice()默认将其切片为轴 0。

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

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)
于 2013-04-19T10:47:25.670 回答
7

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

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
于 2016-03-19T08:15:05.600 回答
1

我通常会.loc/.iloc按照 Ted 的建议去做,但也可以通过转置 DataFrame 来选择一行。留在上面的例子中,df.T[2]给你第 2 行df

于 2021-01-24T00:40:58.897 回答