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代码,关于堆栈溢出有一个很好的讨论:
在早些时候的一篇文章中,它说:
这似乎是“类似数组”的一个主要部分-任何具有getitem和len的项目都是类似数组的。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)