为什么需要将地图类型转换为列表以将其分配给 pandas 系列?

2024-03-29

我刚刚开始学习 pandas 的基础知识,有一件事让我思考。

import pandas as pd
data = pd.DataFrame({'Column1': ['A', 'B', 'C']})
data['Column2'] = map(str.lower, data['Column1'])
print(data)

该程序的输出是:

   Column1                             Column2
 0       A  <map object at 0x00000205D80BCF98>
 1       B  <map object at 0x00000205D80BCF98>
 2       C  <map object at 0x00000205D80BCF98>

获得所需输出的一种可能的解决方案是将地图对象类型转换为列表。

import pandas as pd
data = pd.DataFrame({'Column1': ['A', 'B', 'C']})
data['Column2'] = list(map(str.lower, data['Column1']))
print(data)

Output:

   Column1 Column2
 0       A       a
 1       B       b
 2       C       c

但是,如果我使用 range()(它在 Python 3 中也返回其自己的类型),则无需将对象类型转换为列表。

import pandas as pd
data = pd.DataFrame({'Column1': ['A', 'B', 'C']})
data['Column2'] = range(3)
print(data)

Output:

   Column1  Column2
 0       A        0
 1       B        1
 2       C        2

是否有任何原因为什么范围对象不需要进行类型转换,但地图对象却需要进行类型转换?


TL;DR: ranges have __getitem__, and __len__, while maps don't.


细节

我假设创建新数据框列的语法在某种程度上是语法糖Pandas.DataFrame.插入 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.insert.html,它作为参数value a

标量、级数或类数组

鉴于此,问题似乎简化为“为什么 pandas 将列表和范围视为类似数组,而不是地图?”

See: numpy:“类似数组”对象的正式定义? https://stackoverflow.com/questions/40378427/numpy-formal-definition-of-array-like-objects.

如果您尝试在范围之外创建一个数组,它会很好地工作,因为范围足够接近类似数组,但您不能使用映射来做到这一点。

>>> 将 numpy 导入为 np
>>> foo = np.array(范围(10))
>>> bar = np.array(map(lambda x: x + 1, range(10))
>>> 富
数组([0,1,2,3,4,5,6,7,8,9])
>>> 酒吧
array(, dtype=object)

map不是“类似数组”,而range is.

进一步研究PyArray_GetArrayParamsFromObject https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/ctors.c#L1538,在链接的答案中提到,函数末尾调用 PySequence_Check。该代码是 python 代码,Stack Overflow 上对此有很好的讨论:Python的序列协议是什么? https://stackoverflow.com/questions/43566044/what-is-pythons-sequence-protocol .

早些时候,在相同的文件 https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/ctors.c#L812, 它说:

   /*
     * PySequence_Check detects whether an old type object is a
     * sequence by the presence of the __getitem__ attribute, and
     * for new type objects that aren't dictionaries by the
     * presence of the __len__ attribute as well. In either case it
     * is possible to have an object that tests as a sequence but
     * doesn't behave as a sequence and consequently, the
     * PySequence_GetItem call can fail. When that happens and the
     * object looks like a dictionary, we truncate the dimensions
     * and set the object creation flag, otherwise we pass the
     * error back up the call chain.
     */

这似乎是“类数组”的主要部分 - 任何具有getitem and len类似于数组。range两者都有,同时map两者都没有。

自己尝试一下吧!

__getitem__ and __len__是创建序列所必需且充分的,因此可以让列按您的意愿显示,而不是作为单个对象显示。

尝试这个:

class Column(object):
    def __len__(self):
        return 5
    def __getitem__(self, index):
        if 0 <= index < 5:
            return index+5
        else:
            raise IndexError

col = Column()
a_col = np.array(col)
  • 如果你两者都没有__getitem__() or __len()__,numpy 会为你创建一个数组,但它会包含其中的对象,并且不会为你迭代。
  • 如果您同时拥有这两种功能,它就会按照您想要的方式显示。

(感谢 user2357112 纠正我。在一个稍微简单的例子中,我认为__iter__被要求。它不是。这__getitem__不过,函数确实需要确保索引在范围内。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么需要将地图类型转换为列表以将其分配给 pandas 系列? 的相关文章

随机推荐

  • 为什么双空花括号 { { } } 创建一个只有一个元素而不是零的 std::initializer_list

    我有以下构造函数 MyItem std initializer list
  • Intellij Idea 13 UI Designer 和自动 Gradle 构建

    我使用 Intellij UI Designer 为项目创建表单 当我使用 idea 构建时 一切工作正常 因为它为我处理编译表单 但由于我们最近改用 Gradle 进行构建 所以还无法生成可执行的 jar 文件 我的 google fu
  • Chrome 插件随机向我的 C++ 本机主机应用程序发送垃圾

    我正在尝试为我的大学项目编写一个简单的家长控制应用程序 但我是浏览器插件的新手 我想使用Chrome插件将用户实时查看的主机发送到Qt应用程序 Qt应用程序将分析用户行为 问题是 有时 chrome 发送正确的主机 有时它发送带有空字符串或
  • 从 Delphi exe 执行 RegEdit

    我有德尔福XE2项目 https stackoverflow com questions 16385844 registry node decription in win64在 Windows 注册表中写入一些值 我正在尝试在 Delphi
  • 已完成 Java 项目,现在创建 jar 或 .exe 文件(带有数据库)

    所以 我刚刚完成了一个小的java应用程序 带有数据库和其他东西 我使用了 Netbeans 和 Mysql 现在我想导出我的项目 这样我就可以在任何我想要的地方使用它 任何计算机 即使没有安装 Mysql 或 Java 所以 我尝试了一些
  • 从 setter 方法返回 *this 时,对象变得不可变

    我正在了解这个指针 它包含调用该函数的当前对象的地址 但是当我从成员函数返回当前对象时 我对这个指针有疑问 include
  • foreach、doParallel 和随机生成

    考虑使用并行的非常基本 且效率低下 的代码foreach用于生成随机值 cl lt makeCluster 2 registerDoParallel cl foreach i 1 100 dopar rnorm 1 它是否正确 或者是否需要
  • Laravel Collection 与 groupby、count 和 sum

    我正在努力让一个集合上的 groupby 工作 我还没有得到这个概念 我正在从玩家的表中提取结果集合 雄辩的集合将包含如下数据 player id gt 1 opposition id gt 10 result gt won points
  • 带进度条的可可文件上传

    就问题而言 这确实是一个双重打击 因为确实有两个独立的问题 但它们有点属于在一起 第一个问题 我将如何使用 POST 上传文件 我已经有一个包含文件内容的 NSData 对象 同时在NSProgressIndicator 就像可以做 byt
  • Laravel 5 - 图像验证不起作用

    我使用 Laravel 5 Validator 来验证头像 我的规则如下所示 validator Validator make Request all avatar gt required image max 1000 我正在尝试上传文件
  • 向 ggmap 添加一堆箭头

    我正在绘制一张地图 它应该覆盖来自数据集的多个 gt 400 箭头 其中每个箭头的起点和终点都有纬度 经度对 这是使用 dput 的数据子集 df lt structure list Lat c 49 34054 49 34068 49 3
  • 将轴刻度标签中的一个字符更改为斜体,同时保留多行[重复]

    这个问题在这里已经有答案了 I have a geom col from ggplot2 with labels for categorical axis ticks like below 该图是使用以下代码创建的 library tidy
  • 用java创建一个简单的规则引擎

    我正在探索用 Java 创建简单业务规则引擎的不同方法 我需要向客户展示一个简单的 Web 应用程序 让他配置一堆规则 规则库的示例可能如下所示 这是例子 IF PATIENT TYPE A AND ADMISSION TYPE O SEN
  • RTF 行结束转换出现意外结果

    If txtLog is a RichTextBox http msdn microsoft com en us library system windows forms richtextbox aspx控制 Dim text hi vbC
  • 如何计算给定三个点的抛物线的顶点

    我有三个 X Y 点 形成一条抛物线 我只需要计算经过这三个点的抛物线的顶点是什么 最好是一种快速的方法 因为我必须做很多这样的计算 询问科学家 网站提供这个答案 http www newton dep anl gov askasci ma
  • 如何打印 Node WebKit 版本

    如果我想检查哪个节点WebKit https github com nwjs nw js我正在使用的版本 我将如何从命令行执行此操作 要了解应用程序中node webkit的版本 以便确定某些API是否可用 可以使用 process ver
  • 循环访问 ARM 模板中的值

    我已经花了一天多的时间来解决 ARM 模板遇到的问题 并且似乎陷入困境 所以询问 SO 以防有人可以提供帮助 为了描述该问题 我有一个现有的 Azure Key Vault 设置 并希望向该资源组添加许多访问策略 出于参考目的 以下是用于添
  • 如何使文件系统缓存失效?

    我想测量 优化应用程序的 冷启动 启动性能 如果不实际重新启动就很难做到这一点 这显然不是一个理想的解决方案 有没有一种方法可以使整个系统的文件缓存无效 以便映射的页面访问实际上导致磁盘访问 以便我可以测量程序启动所需的时间 信息 我非常需
  • 如何使用 perl 将完整路径转换为相对路径?

    我在 Perl 程序的两个变量中拥有文件的完整路径和其父目录之一的完整路径 什么是计算文件相对于父目录的相对路径的安全方法 需要在 windows 和 unix 上工作 e g filePath full path to my file p
  • 为什么需要将地图类型转换为列表以将其分配给 pandas 系列?

    我刚刚开始学习 pandas 的基础知识 有一件事让我思考 import pandas as pd data pd DataFrame Column1 A B C data Column2 map str lower data Column