当前位置: 首页 > 面试题库 >

索引在pandas中如何工作?

苏坚成
2023-03-14
问题内容

我是python的新手。这似乎是一个基本问题。但我真的很想了解这里发生了什么

import numpy as np 
import pandas as pd 
tempdata = np.random.random(5)
myseries_one = pd.Series(tempdata)
myseries_two = pd.Series(data = tempdata, index = ['a','b','c','d','e'])
myseries_three = pd.Series(data = tempdata, index = [10,11,12,13,14])


myseries_one
Out[1]: 
0    0.291293
1    0.381014
2    0.923360
3    0.271671
4    0.605989
dtype: float64

myseries_two
Out[2]: 
a    0.291293
b    0.381014
c    0.923360
d    0.271671
e    0.605989
dtype: float64

myseries_three
Out[3]: 
10    0.291293
11    0.381014
12    0.923360
13    0.271671
14    0.605989
dtype: float64

索引每个数据帧中的第一个元素

myseries_one[0] #As expected
Out[74]: 0.29129291112626043

myseries_two[0] #As expected
Out[75]: 0.29129291112626043

myseries_three[0]
KeyError:0

疑问1:为什么会这样?为什么myseries_three [0]给我一个keyError?调用myseries_one [0],myseries_one
[0]或myseries_three [0]是什么意思?以这种方式调用是否意味着我们以行名进行调用

疑问2:-Python中的行名和行号是否与R中的行名和行号不同?

myseries_one[0:2]
Out[78]: 
0    0.291293
1    0.381014
dtype: float64

myseries_two[0:2]
Out[79]: 
a    0.291293
b    0.381014
dtype: float64

myseries_three[0:2]
Out[80]: 
10    0.291293
11    0.381014
dtype: float64

疑问3:-如果调用myseries_three [0]意味着要通过行名进行调用,那么myseries_three
[0:3]如何产生输出?myseries_three [0:4]表示我们正在按行号调用吗?请解释和指导。我正在从R迁移到python。所以这让我有些困惑。


问题答案:

当您尝试使用切片时myseries[something]something通常是不明确的。您正在强调这种歧义的情况。就您而言,熊猫试图通过猜测您的意思来帮助您。

myseries_one[0] #As expected
Out[74]: 0.29129291112626043

myseries_one有整数标签。这是有道理的,当您尝试使用整数进行切片时,您打算获取标有该整数的元素。事实证明,您有一个标有的元素,0以便返回给您。

myseries_two[0] #As expected
Out[75]: 0.29129291112626043

myseries_two有字符串标签。您极不可能0在标签全部为字符串的情况下用该标签切片该系列。因此,pandas假定您的意思是,0然后返回第一个元素(感谢pandas,这很有用)。

myseries_three[0]
KeyError:0

myseries_three具有整数标签,并且您尝试使用整数切片…完美。就让我们为你值…
KeyError。糟糕,该索引标签不存在。在这种情况下,大熊猫失败要比猜测您打算按位置分割要安全得多。该文档甚至建议,如果要消除歧义,请loc用于基于标签的切片和iloc基于位置的切片。

我们试试吧 loc

myseries_one.loc[0]
0.29129291112626043

myseries_two.loc[0]
KeyError:0

myseries_three.loc[0]
KeyError:0

只有myseries_one一个标签0。其他两个返回KeyErrors

我们试试吧 iloc

myseries_one.iloc[0]
0.29129291112626043

myseries_two.iloc[0]
0.29129291112626043

myseries_three.iloc[0]
0.29129291112626043

它们都具有的位置,0并相应地返回第一个元素。

对于范围切片,pandas决定减少解释,并坚持对整数切片进行位置切片0:2。记住。做出这些决定的是实际的真实人(编写熊猫代码的程序员)。当您尝试做一些模棱两可的事情时,您可能会得到不同的结果。要消除歧义,请使用lociloc

iloc

myseries_one.iloc[0:2]

0    0.291293
1    0.381014
dtype: float64

myseries_two.iloc[0:2]

a    0.291293
b    0.381014
dtype: float64

myseries_three.iloc[0:2]

10    0.291293
11    0.381014
dtype: float64

loc

myseries_one.loc[0:2]

0    0.291293
1    0.381014
2    0.923360
dtype: float64

myseries_two.loc[0:2]

TypeError: cannot do slice indexing on <class 'pandas.indexes.base.Index'> with these indexers [0] of <type 'int'>

myseries_three.loc[0:2]

Series([], dtype: float64)


 类似资料:
  • 有两个问题看起来很相似,但它们不是同一个问题:这里和这里。它们都调用的方法,例如或,我知道这会返回一个。我要问的是如何将(class)对象本身转换为。我将在下面举例说明。 构建一个示例,如下所示。 上面的应该如下所示(显然有不同的数字)。 我想做的是按列名称和采取分组(按此顺序),这样我就可以得到一个由列名称和采取构建的多索引索引,如下所示。 我如何实现这一点?如果我做了,那么是一个实例。正确的做

  • 现在,我要检索一个值: Q1:在[3.3,6.6]范围内-预期返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6](包括最后一个),如果没有,则为[3.3,5.5]或[3.3,3.3,5.5]。 Q2:在[2.0,4.0]范围内-预期返回值:[3.3]或[3.3,3.3] 对于任何其他多索引维度都是相同的,例如B值: Q3:在范围[111,500]中有重复,作为范围中的数据行数-

  • 问题内容: 我有以下代码, 在csv文件没有足够的覆盖范围(所有工作日)之前,它一直有效。例如,对于以下.csv文件, 我会收到以下错误: 它似乎有一个非常简单的修复程序,但是我对Python来说还太陌生,不知道如何修复它。 问题答案: 使用以获得您所需要的所有列。它将保留已经存在的那些,否则将其放入空列。 因此,您的整个代码示例应如下所示:

  • 问题内容: 我对MySQL索引的工作方式非常感兴趣,更具体地说,它们如何在不扫描整个表的情况下返回请求的数据? 我知道这是题外话,但是如果有人可以向我详细解释一下,我将非常非常感谢。 问题答案: 基本上,表上的索引的作用类似于书中的索引(这就是名称的来源): 假设您有一本关于数据库的书,并且想要查找有关存储的信息。没有索引(假设没有其他帮助,例如目录),则必须逐个浏览页面,直到找到主题(即)为止。

  • 考虑以下查询: 该查询将如何在Cassandra中“在引擎盖下”执行? 高基数列索引()将如何影响其性能? Cassandra会为上述查询接触所有节点吗?为什么? 先执行哪个条件,基表partition_key还是辅助索引partition_key?Cassandra将如何将这两个结果相交?

  • 问题内容: 这个问题在python中: 第一次打印给出0,第二次打印给出p 我不知道为什么,如果您能给出解释,将不胜感激。 谢谢那些帮助的人:) 问题答案: 索引从开始。所以战列舰包含索引项,,,。 首先获取列表列表的长度,即4。 通过索引值访问列表中的项目。因此,第一次调用该函数: 这是哪个是哪个