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

了解pandas数据框索引

百里阳平
2023-03-14
问题内容

摘要:这不起作用:

df[df.key==1]['D'] = 1

但是这样做:

df.D[df.key==1] = 1

为什么?

再生产:

In [1]: import pandas as pd

In [2]: from numpy.random import randn

In [4]: df = pd.DataFrame(randn(6,3),columns=list('ABC'))

In [5]: df
Out[5]: 
          A         B         C
0  1.438161 -0.210454 -1.983704
1 -0.283780 -0.371773  0.017580
2  0.552564 -0.610548  0.257276
3  1.931332  0.649179 -1.349062
4  1.656010 -1.373263  1.333079
5  0.944862 -0.657849  1.526811

In [6]: df['D']=0.0

In [7]: df['key']=3*[1]+3*[2]

In [8]: df
Out[8]: 
          A         B         C  D  key
0  1.438161 -0.210454 -1.983704  0    1
1 -0.283780 -0.371773  0.017580  0    1
2  0.552564 -0.610548  0.257276  0    1
3  1.931332  0.649179 -1.349062  0    2
4  1.656010 -1.373263  1.333079  0    2
5  0.944862 -0.657849  1.526811  0    2

这不起作用:

In [9]: df[df.key==1]['D'] = 1

In [10]: df
Out[10]: 
          A         B         C  D  key
0  1.438161 -0.210454 -1.983704  0    1
1 -0.283780 -0.371773  0.017580  0    1
2  0.552564 -0.610548  0.257276  0    1
3  1.931332  0.649179 -1.349062  0    2
4  1.656010 -1.373263  1.333079  0    2
5  0.944862 -0.657849  1.526811  0    2

但是这样做:

In [11]: df.D[df.key==1] = 3.4

In [12]: df
Out[12]: 
          A         B         C    D  key
0  1.438161 -0.210454 -1.983704  3.4    1
1 -0.283780 -0.371773  0.017580  3.4    1
2  0.552564 -0.610548  0.257276  3.4    1
3  1.931332  0.649179 -1.349062  0.0    2
4  1.656010 -1.373263  1.333079  0.0    2
5  0.944862 -0.657849  1.526811  0.0    2

链接到笔记本

我的问题是:

为什么只有第二种方式起作用?我似乎看不到选择/索引逻辑的差异。

版本是0.10.0

编辑:这不应该再这样了。从0.11版开始,提供.loc。参见此处:http : //pandas.pydata.org/pandas-
docs/stable/indexing.html


问题答案:

大熊猫文档说:

返回视图与副本

关于何时返回数据视图的规则完全取决于NumPy。每当索引操作涉及标签数组或布尔向量时,结果将是副本。使用单个标签/标量索引和切片,例如df.ix
[3:6]或df.ix [:,’A’],将返回视图。

df[df.key==1]['D']您首先进行布尔切片(导致 Dataframe 的副本),然后选择列[‘D’]。

在中df.D[df.key==1] = 3.4,您首先选择一列,然后对所得 Series 进行布尔切片。

尽管我必须承认这有点违反直觉,但这似乎有所不同。

编辑
:区别是由Dougal标识的,请参阅他的评论:对于版本1,将在为__getitem__布尔切片调用方法时进行复制。对于版本2,仅__setitem__访问该方法-
因此不返回副本而是仅进行分配。



 类似资料:
  • 问题内容: 显示大pandas数据框时是否可以隐藏索引,以便仅列名出现在表格的顶部? 这将需要同时适用于ipython笔记本中的html表示形式和to_latex()函数(我正在与nbconvert一起使用)。 助教。 问题答案: 组 对于ipython笔记本: 对于to_latex:

  • 问题内容: 我正在尝试将csv文件中的数据读取到pandas数据框中,并访问第一列“日期” 产生以下结果 如果我尝试访问“打开”或“音量”之类的任何其他列,则它按预期运行 问题答案: 您很可能在文件的开头有一个额外的字符,该字符位于您的第一列名称之前。只需将您的输出复制/粘贴到非Unicode控制台生成。

  • 基于单个值/标签的切片 基于一个或多个级别的多个标签的切片 布尔条件和表达式的过滤 哪些方法适用于什么情况 为简单起见的假设: 输入数据表没有重复的索引键 下面的输入数据只有两个级别。(此处所示的大多数解决方案都概括为N个级别) 问题2b 我如何获得级别“二”中对应于“t”和“w”的所有值? 如何从检索横截面,即具有索引特定值的单行?具体来说,如何检索的横截面,由 如何选择与和相对应的两行?

  • 问题内容: 我有一个数据框,类似: 我想在数据框的末尾添加一个“总计”行: 我尝试使用该命令,但最终得到一个Series,尽管可以将其转换回Dataframe,但它不维护数据类型: 我想维护原始数据帧中的数据类型,因为我需要对总行应用其他操作,例如: 问题答案: 将总计行附加到 仅当您有一列字符串或对象时,才需要进行转换。 这是一个脆弱的解决方案,因此我建议仍然坚持对数据框进行操作。例如。

  • 问题内容: 用更多索引范围(例如by和)对数据帧进行切片的pythonic方法是什么? 我想要一个更优雅的方式: 结果: 像这样的东西会更优雅: 问题答案: 您可以使用numpy的“切片技巧”: 给出:

  • 问题内容: 我敢肯定有一种明显的方法可以做到这一点,但现在还不能想到任何光滑的东西。 基本上不是引发异常,而是要获取或查看pandas索引中是否存在值。 我现在工作的是以下内容 问题答案: 这应该可以解决问题