Python 按整数索引选择系列/数据帧的行

Python 按整数索引选择系列/数据帧的行,python,pandas,dataframe,indexing,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.5

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

您可以将DataFrame视为一个系列的dict
df[key]
尝试通过
key
选择列索引,并返回一个序列对象

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

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


您可以查看

DataFrame
有一个私有函数
\u slice()
DataFrame
进行切片,它允许参数
axis
确定要切片的轴。调用
\u slice()
时,
数据帧的
\uu getitem\uuuuuuuuuu()
未设置轴。因此,默认情况下,
\u 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中的新文档

这里我们有了新的操作符,
.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

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

您可以像这样在数据框中循环

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

到基于索引的对大熊猫表的访问,也可以考虑NUMPY.ASYARSARE选项,将表转换为NUPY数组为

np_df = df.as_matrix()
然后

np_df[i] 
将起作用。

数据帧索引操作符,
[]
的主要目的是选择列。 当向索引运算符传递字符串或整数时,它会尝试查找具有该特定名称的列并将其作为序列返回

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


当使用切片表示法时,DataFrame索引操作符完全改变了选择行的行为 奇怪的是,当给定一个切片时,DataFrame索引操作符选择行,并且可以通过整数位置或索引标签来选择行

df[2:3]
这将从整数位置为2到3的行开始切片,不包括最后一个元素。所以,就一排。以下每三行选择从整数位置6开始到但不包括20的行

df[6:20:3]
如果数据帧索引中包含字符串,则还可以使用由字符串标签组成的切片。有关更多详细信息,请参阅


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

我通常会按照Ted的建议选择
.loc/.iloc
,但也可以通过转换数据帧来选择行。在上面的例子中,
df.T[2]
给出了
df

的第2行,如果您想要第2行、第3行和第4行呢?您只需传递一个索引器列表;上面提到的文件有人对这些名字有理由吗?我发现这些很难记住,因为我不确定为什么
iloc
是行,而
loc
是标签。@kilojoules
。iloc
按照它们在索引中的顺序查找(例如
。iloc[[2]]
)是
df
中的第二行。该行恰好位于索引位置
4
.loc
根据它们的索引值查找它们。所以,也许“iloc”就像
A[i]
?:)中的“i”@Jeff-这非常有效,但是如果要从数据帧复制一行,例如
df.loc[-1]=df.iloc[[0]]
,并插入该行,会发生什么情况?框架附带了一个添加的索引列,给出错误
ValueError:无法设置列不匹配的行
(请参阅)
df.ix[2]
不起作用-至少在
pandas版本“0.19.2”中不起作用
通过索引操作符
[]
,查看行和列选择之间的差异。也不要使用
.ix
,不推荐使用它。不确定它是否有用,但如果只是想阅读/查看,可以使用
df.values[n]
查看第n行。这破坏了数据帧索引和其他所有功能。如果用户试图使用indxeing运算符将行添加到另一个数据帧,但另一个数据帧仍然为空。为什么?谢谢你的提示。有趣的是,这种事情有时仍然让人质疑。在某些情况下为行为添加异常。。对我来说,这就像为了一点方便而牺牲一致性。