Python 为什么需要在列表中键入地图才能将其指定给熊猫系列?

Python 为什么需要在列表中键入地图才能将其指定给熊猫系列?,python,python-3.x,pandas,Python,Python 3.x,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 0x00000

我刚刚开始学习熊猫的基本知识,有一件事让我思考

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>
输出:

Column1 Column2
0 A A
1 B B
2c
但是,如果我使用range(),它在Python3中也返回自己的类型,则无需将对象类型转换为列表

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

Column1 Column2
0 A 0
1 B 1
2 C 2

是否有任何理由不要求对范围对象进行类型转换,而对地图对象进行类型转换?

TL;DR:
范围
获取项目
,和
长度
,而
映射
没有


细节 我假设创建一个新的dataframe列的语法在某种程度上是语法糖,它作为
value
a的参数

标量、级数或类似数组

鉴于此,问题似乎归结为“为什么熊猫将列表和范围视为数组,而不是地图?”

请参阅:

如果您尝试在一个范围外创建一个数组,效果很好,因为范围足够接近数组,但您不能使用贴图

>>>将numpy作为np导入
>>>foo=np.数组(范围(10))
>>>条形=np.数组(映射(λx:x+1,范围(10))
>>>福
数组([0,1,2,3,4,5,6,7,8,9])
>>>酒吧
数组(,dtype=object)

map
不是“数组式”,而
range

进一步研究,在链接的答案中提到,函数的结尾调用PySequence_Check。该代码是python代码,关于堆栈溢出有一个很好的讨论:

在早些时候的一篇文章中,它说:

这似乎是“类似数组”的一个主要部分-任何具有getitemlen的项目都是类似数组的。
range
同时具有这两个属性,而
map
两者都没有

你自己试试吧!
\uuuu getitem\uuuuuuuuuuuuuuuuu
\uuuuuuu len\uuuuuuuuuuuuuuuuuuuuuuuu
是创建序列所必需的,因此可以让列按您的意愿显示,而不是作为单个对象显示

试试这个:

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)
类列(对象):
定义(自我):
返回5
定义uu获取项目uu(自身,索引):

如果0我能够在0.20.3中重现这两个示例,这可能就是熊猫拥有
数据['Column1'].map(str.lower)
?我不知道答案,但可能与内置映射不同于数组映射有关?这不是一个直接的答案,但您可能有兴趣找到
数据['Column1'].map(str.lower)
直接将您带到列表映射结果。乍一看,这似乎很奇怪,因为只将
映射
应用于值。@在这种情况下,OP应该使用
数据['Column1'].str.lower()
虽然…@JonClements我同意这样做更可取。只要注意原生
map
系列之间的区别。map
@Bharathshetty我回滚了您的编辑-在我看来,OP显然意识到添加map只会产生一个元素。我觉得您的添加无助于澄清原因。还有interest:。在这种情况下,
映射
对象是可编辑的(与
范围
一样),但前者似乎不像数组,而后者则是。
\uuuu len\uuuu
\uuuu getitem\uuuuu
应该足够了;问题是您的
\uuuuu getitem\uuuuu
没有为超出范围的访问生成
索引器。此外,代码中关于PySequence\u检查的注释不太正确;PySequence\u检查不正确t实际上不寻找
\uuuuu len\uuuuuu
(我相信NumPy代码中认为没有
\uuuuuuu len\uuuuuu
的对象是非序列的部分实际上是同一函数前面的
PySequence\u Length(obj)<0
检查。)@user2357112谢谢您提供的详细信息!我已将索引器合并到我的答案中。我不确定如何处理您的其他声明。如果您想将其作为评论保留,那很好。如果您喜欢在自己中编辑它,欢迎使用。
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)