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视为一个系列的dictdf[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运算符将行添加到另一个数据帧,但另一个数据帧仍然为空。为什么?谢谢你的提示。有趣的是,这种事情有时仍然让人质疑。在某些情况下为行为添加异常。。对我来说,这就像为了一点方便而牺牲一致性。