栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从嵌套列表创建DataFrame时可以访问read_csv()的dtype推理引擎吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从嵌套列表创建DataFrame时可以访问read_csv()的dtype推理引擎吗?

一种解决方案是使用

StringIO
对象。唯一的区别是,它将所有数据保留在内存中,而不是写入磁盘并回读。

代码如下(注意:Python 3!):

import numpy as npimport pandas as pdimport csvfrom io import StringIOdata = [['string_boolean', 'numeric', 'numeric_missing'],        ['FALSE', 23, 50],        ['TRUE', 19, 12],        ['FALSE', 4.8, '']]with StringIO() as fobj:    writer = csv.writer(fobj)    writer.writerows(data)    fobj.seek(0)    df = pd.read_csv(fobj)print(df.head(3))print(df.string_boolean.dtype) # Automatically converted to boolprint(df.numeric.dtype) # Float, as expectedprint(df.numeric_missing.dtype) # Float, doesn't care about empty string

with StringIO() as fobj
是不是真的有必要:
fobj =String()
将工作一样很好。并且由于上下文管理器将在
StringIO()
对象范围之外关闭对象,因此
df =pd.read_csv(fobj)
必须在对象内部。
还要注意
fobj.seek(0)
,这是另一个必要条件,因为您的解决方案只是关闭并重新打开文件,这将自动将文件指针设置为文件的开头。

关于Python 2与Python 3的说明

我实际上试图使以上代码与Python 2/3兼容。由于以下原因,这变得一团糟:Python 2具有一个

io
模块,就像Python
3一样,该模块的
StringIO
类使所有代码都是unipre的(在Python 2中也是如此;在Python 3中,它当然是默认的)。
很好,除了
csv
Python 2中的writer模块 兼容Unipre。
因此,替代方法是使用(较旧的)Python 2
(c)StringIO
模块,例如,如下所示:

try:    from cStringIO import StringIOexcept ModuleNotFoundError:  # Python 3    from io import StringIO

并且在Python 2中将是纯文本,在Python 3中将是unipre。
除非现在

cStringIO.StringIO
没有上下文管理器,
with
否则该语句将失败。正如我提到的那样,这并不是真正必要的,但是我使事情尽可能地接近您的原始代码。
换句话说,如果没有可笑的技巧,我找不到一种很好的方法来保持接近原始代码。

我还考虑了完全避免CSV编写器,从而导致:

text = 'n'.join(','.join(str(item).strip("'") for item in items)       for items in data)with StringIO(text) as fobj:    df = pd.read_csv(fobj)

也许更整洁(虽然不太清楚), 并且与 Python 2/3兼容。(我不希望它能在

csv
模块可以处理的所有事情上正常工作,但是在这里它可以正常工作。)


为什么不能
pd.Dataframe(...)
进行转换?

在这里,我只能推测。

我认为原因是,当输入是Python对象(字典,列表)时,输入是已知的,并由程序员掌握。因此,该输入不太可能包含诸如

'FALSE'
或的字符串,甚至是不合逻辑的
''
。相反,它通常包含对象
False
np.nan
(或
math.nan
),因为程序员已经处理了(字符串)转换。
而对于文件(CSV或其他文件),输入内容可以是任何内容:您的同事可能发送了Excel
CSV文件,或者其他人向您发送了数字CSV文件。我不知道CSV文件的标准化程度,但是您可能需要一些代码来允许例外情况,并且总体上需要将字符串转换为Python(NumPy)格式。

因此,从这种意义上讲,期望

pd.DAtaframe(...)
只接受任何内容实际上是不合逻辑的:相反,它 应该 接受格式正确的内容。

您可能会争辩一种采用类似您的列表的便捷方法,但是列表不是CSV文件(它只是一堆字符,包括换行符)。另外,我希望

pd.read_csv
可以读取大块文件(也许是逐行读取)的选项,如果您用换行符代替它,则会变得更加困难(您不能真正逐行读取该文件,因为您将不得不在换行符上将其拆分,并将所有行都保留在内存中。并且您已经在内存中某个位置(而不是磁盘上)存储了完整的字符串。但是我离题了。

此外,

StringIO
技巧只是几行以精确地执行此技巧。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624608.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号