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

362 python indexing dataframe 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
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*eff 512

回应@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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您想要第2和第3和第4行怎么办? (6认同)
  • 您可以简单地传递索引器列表;文档指向上面 (3认同)
  • @kilojoules`.iloc`通过索引中的顺序查找事物(例如`.iloc [[2]]`)是df中的第二个“行”。该行恰好在_index_位置“ 4”处。.loc通过它们的索引值查找它们。那么也许“ iloc”就像“ A [i]”中的“ i”一样?:) (3认同)
  • 有没有人有这些名字的理由?我发现这些很难记住,因为我不确定为什么`iloc`是行,`loc`是标签. (2认同)

Ted*_*rou 51

DataFrame索引运算符的主要用途[]是选择列.

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

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


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

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

df[2:3]
Run Code Online (Sandbox Code Playgroud)

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

df[6:20:3]
Run Code Online (Sandbox Code Playgroud)

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

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


HYR*_*YRY 23

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

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

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

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


Pav*_*zka 14

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

np_df = df.as_matrix()
Run Code Online (Sandbox Code Playgroud)

然后

np_df[i] 
Run Code Online (Sandbox Code Playgroud)

会工作.

  • 这会破坏数据帧索引的全部目的以及pandas提供的所有其他功能 (10认同)

wai*_*kuo 7

您可以查看源代码.

DataFrame有一个私有函数_slice()来切片DataFrame,它允许参数axis确定要切片的轴.将__getitem__()用于DataFrame在调用不设置轴_slice().所以_slice()切片默认为0.

你可以做一个简单的实验,这可能会对你有所帮助:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)
Run Code Online (Sandbox Code Playgroud)


小智 6

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

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
Run Code Online (Sandbox Code Playgroud)