哪位大佬帮助解释下红框这里为什么需要下标?

科技   2024-09-14 09:01   湖南  
下次点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

言入黄花川,每逐清溪水。

大家好,我是Python进阶者。

一、前言

前几天在Python白银交流群【沐子山树】问了一个Pandas数据处理的问题,问题如下:哪位大佬帮助解释下红框这里为什么需要下标。

只有一个值,后面那个绿框里面的括号用了转义字符,不是要取的值。

二、实现过程

这里【瑜亮老师】给了一个解答,具体如下所示:str.extract返回的是一个DataFrame,这里是文档内容你可以仔细阅读一下。

【沐子山树】:df["年龄"]=df["年龄"].str.extract(r"我是(\d+)岁").astype(int) 但是我如果不用loc筛选,是没有问题的,用了loc之后就不行了,要加下标,从截图看也可以返回Series。

【瑜亮老师】:我看文档中关于str.extract的用法是说expand=False才返回Series or Index。If expand=False and pat has only one capture group, then return a Series (if subject is a Series) or Index (if subject is an Index).要求有两个,expand=False,且只匹配一个组。这时候才返回Series,而默认expand: bool = True,因此,默认返回的是df。

【沐子山树】:假设返回的是df,只有一列的df应该是可以给Series赋值的吧?

【瑜亮老师】:你这里是expand使用默认值True,因此返回的是df,有因为这个df中只有一列,所以,不用索引的时候也能得到正确的结果。至于你说的.loc的问题,我还没有深入研究。

【沐子山树】:这个场景下即使没有下标,那就是只有一列的df给Series赋值,理论上应该没问题,但实际不行,赋值完打印出来为NAN

【瑜亮老师】:因为关于这个df.loc,在之前的版本中是和df[列名]是通用的,后来更新版本后(具体没有留意是哪个版本)开始出现提醒警告,说是在未来的版本中建议用.loc取列。在更加新的版本中,有些情况下会出现报错。具体的使用方法我还没有研究过。我是习惯用df[列名]的,出现提示或者报错的时候再换成df.loc

【沐子山树】:我重新构建了十几行的试验数据,现象就是:如果整列extract,然后赋值给整列,无需下标;如果loc一列的部分行进行extract,然后赋值给loc区域,需要下标,不知道什么原因。

【瑜亮老师】:那是因为根据条件提取出来的数据只是一个视图,

【沐子山树】:没有看懂呢

【瑜亮老师】:这个只是我的一个猜测,明天再试验一下。

【沐子山树】:嗯嗯,这里确实挺奇怪的。

【论草莓如何成为冻干莓】:这里extract提取了两个值,图里只想要提取匹配到的第一个,使用loc是因为有布尔索引,不用loc是错误用法

【沐子山树】:extract值提取了一个值,第二个括号不是提取值、已经加了转义符号\,“不用loc是错误用法”,没有理解意思。

【论草莓如何成为冻干莓】:是的,这个说错了,extract默认返回值是dataframe,因为你进行了行布尔索引,如果只筛选列是可以省略loc的。加上行条件判断就必须用loc

【沐子山树】:用loc能理解,因为有筛选行,目前问题是为什么用了loc后,extract的结果之后需要[0]

【论草莓如何成为冻干莓】:简单来说这段代码是两部分

【沐子山树】:对,能理解两部分

【论草莓如何成为冻干莓】:extract结果需要0并不是因为loc,而是extract提取的结果是dataframe,而这个结果显然不是赋值到销量值列上的,需要进一步取到结果中的第一列,也就是索引列号为0的列结果进行赋值到销量值列上。

【沐子山树】:df["销量值"] = df["销量"].str.extract(r'热销(\d+)件(近\d+小时)').astype(int),这句代码是通的,不需要[0],是什么原因呢?

【论草莓如何成为冻干莓】:使用loc仅仅是因为这段代码仅需要对销量列上包含或不包含万件的行进行变更

【沐子山树】:loc能理解,不能理解的就是这句代码不用加[0],而截图那句需要加[0]

【论草莓如何成为冻干莓】:原来是不是不存在销量值,这个就相当于新增了一列。dataframe是可以当作新的一列进行新增的。

【沐子山树】:两句都是新增

【论草莓如何成为冻干莓】:不是

【沐子山树】:是,实际运行结果是

【论草莓如何成为冻干莓】:你进行布尔索引后就不是新增了,会认为变更,pandas不认为,这个时候可以看作把dataframe赋值到series中,显然是不行的,这样写是dataframe赋值给dataframe,显然可以。

【沐子山树】:df["销量值"]是Series不是dataframe

【论草莓如何成为冻干莓】:并且series赋值给dataframe也是认为可以的,新增列是属于dataframe范畴的

【沐子山树】:type出来是Series

【论草莓如何成为冻干莓】:已存在的列进行部分变更为series范畴

【沐子山树】:这句怎么看出来是已存在的列?

【论草莓如何成为冻干莓】:只要是部分变更都属于

【沐子山树】:实际运行代码前是没有销量值这一列的

【论草莓如何成为冻干莓】:会先给赋值一列空值,然后进行填充

【沐子山树】:我总结下大佬的意思是,Series能接收dataframe的唯一场景是新增列的时候,Series的更改场景只能是接收Series,对吗?

【论草莓如何成为冻干莓】:有用过numpy吗,类似于你填充的不够时它是不允许的,pandas就是把这部分已经在里面给你做好了,就是先造了一个空列。但其实series接收dataframe是也不会报错,只是实际结果发现是空值。

【沐子山树】:确实,如果不加下标,赋值后打印出来为空。“Series能接收dataframe的唯一场景是新增列的时候”,验证了一下,这句话并不成立,老列修改的时候,Series依然能接收单列dataframe。

【论草莓如何成为冻干莓】:当列进行完全变更时仍然符合这种情形

【沐子山树】:难道extract生成的df与其他df有啥不同,这看起来一般df可以赋值给loc,extract的df就不行。

【论草莓如何成为冻干莓】:这里还少一种他的这种情形,就是非同名列赋值。

【论草莓如何成为冻干莓】:补充说明部分,包含你上面存在情形。

【论草莓如何成为冻干莓】:这个跟普通还是extract的df没关系,pandas并不会认为这个是extract出来的df就区别对待。

【沐子山树】:哦,我可能还是没抓住本质

【论草莓如何成为冻干莓】:简单来说,如果是全列进行重新赋值可以直接用dataframe,否则用series。series在任何情况下都可以使用。

【沐子山树】:结论虽然是有了,但确实没理解为什么extract生成的df不能赋值给loc区域,这里演示数据是可以用df赋值给loc区域的。

【论草莓如何成为冻干莓】:这里是同名列赋值

【沐子山树】:什么叫同名列赋值

【论草莓如何成为冻干莓】:df2的A列赋值给df的A列,列名是一样的。

【沐子山树】:哦哦,我试着换下列名看看

顺利地解决了自己的问题。

如果你也有类似这种Python相关的小问题,欢迎随时来交流群学习交流哦,有问必答!

三、总结

大家好,我是Python进阶者。这篇文章主要盘点了一个Pandas数据处理的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。

最后感谢粉丝【沐子山树】提出的问题,感谢【瑜亮老师】、【论草莓如何成为冻干莓】给出的思路,感谢【莫生气】等人参与学习交流。

【提问补充】温馨提示,大家在群里提问的时候。可以注意下面几点:如果涉及到大文件数据,可以数据脱敏后,发点demo数据来(小文件的意思),然后贴点代码(可以复制的那种),记得发报错截图(截全)。代码不多的话,直接发代码文字即可,代码超过50行这样的话,发个.py文件就行。

大家在学习过程中如果有遇到问题,欢迎随时联系我解决(我的微信:pdcfighting1),应粉丝要求,我创建了一些高质量的Python付费学习交流群和付费接单群,欢迎大家加入我的Python学习交流群和接单群!

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

------------------- End -------------------

往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

Python爬虫与数据挖掘
人生苦短,我用Python。该公众号专注于分享Python网络爬虫、数据挖掘、数据分析、数据处理、数据可视化、自动化测试、运维、大数据、人工智能、云计算、机器学习等工具资源、热点资讯、相关技术文章、学习视频和学习资料等,期待您的加入~~~
 最新文章