通过整数索引选择一行熊猫系列/数据框

2025-02-18 09:24:00
admin
原创
34
摘要:问题描述:我很好奇为什么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 ...

问题描述:

我很好奇为什么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]。不支持通过单个整数索引行是否有设计原因?


解决方案 1:

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

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

解决方案 2:

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

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

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


当使用切片符号时,DataFrame 索引运算符完全改变选择行的行为

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

df[2:3]

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

df[6:20:3]

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

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

解决方案 3:

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

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

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

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

解决方案 4:

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

np_df = df.as_matrix()

进而

np_df[i] 

会起作用。

解决方案 5:

你可以看一下源代码。

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

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

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

解决方案 6:

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

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

解决方案 7:

如果要通过整数索引对多行进行索引,请使用索引列表:

idx = [2,3,1]
df.iloc[idx]

注意:如果idx使用某些规则创建,那么您也可以使用.iloc(或.loc) 对数据框进行排序,因为输出将按 排序idx。因此从某种意义上说,iloc可以充当排序函数,其中idx是排序键。

解决方案 8:

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用