Python 使用pandas.read_csv读取文件:为什么特定列被读取为字符串而不是浮点? 一点背景:

Python 使用pandas.read_csv读取文件:为什么特定列被读取为字符串而不是浮点? 一点背景:,python,pandas,Python,Pandas,我正在运行一个二进制恒星演化代码,并将演化历史存储为gzip.dat文件。我以前有一个较小的数据集,生成了一些~2000.dat文件,我在后处理过程中通过从每个文件中添加列表数据来读取这些文件,从而创建一个3d列表。每个.dat文件看起来都有点像这样 但最近我开始使用一个更大的数据集,进化历史文件的数量增加到了10万个。因此,我决定将.dat文件压缩为gzip,并将其保存在压缩文件夹中。原因是,我在远程服务器上执行所有这些操作,并且磁盘配额有限 主查询: 在后处理过程中,我尝试使用熊猫从所有这些

我正在运行一个二进制恒星演化代码,并将演化历史存储为gzip.dat文件。我以前有一个较小的数据集,生成了一些~2000.dat文件,我在后处理过程中通过从每个文件中添加列表数据来读取这些文件,从而创建一个3d列表。每个.dat文件看起来都有点像这样

但最近我开始使用一个更大的数据集,进化历史文件的数量增加到了10万个。因此,我决定将.dat文件压缩为gzip,并将其保存在压缩文件夹中。原因是,我在远程服务器上执行所有这些操作,并且磁盘配额有限

主查询: 在后处理过程中,我尝试使用熊猫从所有这些文件中读取数据,将其作为二维numpy数组进行堆叠,形成一个三维列表(每个文件的长度不同,因此我无法使用numpy.append,而必须使用列表)。为了实现这一点,我使用以下方法:

def read_evo_history(EvoHist, zipped, z):
    ehists = []
    for i in range( len(EvoHist) ):
        if zipped == True:
            try:  
                ehists.append( pd.read_csv(z.open(EvoHist[i]), delimiter = "\t", compression='gzip', header=None).to_numpy() )
            except pd.errors.EmptyDataError:
                pass
    return ehists

outdir = "plots"
indir = "OutputFiles_allsys"


z = zipfile.ZipFile( indir+'.zip' )

EvoHist = []
for filename in z.namelist():
    if not os.path.isdir(filename):
        # read the file
        if filename[0:len("OutputFiles_allsys/EvoHist")] == "OutputFiles_allsys/EvoHist":
            EvoHist.append( filename )


zipped = True
ehists = read_evo_history(EvoHist, zipped, z)
del z                                 # Cleanup (if there's no further use of it after this)
我现在面临的问题是,数据中的一个特定列被读取为字符串列表,而不是浮点。读取文件时是否需要转换数据类型?或者这是由于正在读取的文件中的数据类型不一致造成的?是否有一种方法可以将数据获取为浮点数组的三维列表

注:如果这是由于输入文件不一致造成的,那么我恐怕无法再次运行我的二进制恒星演化代码,因为生成所有这些文件需要几天的时间

如果需要的话,我将非常乐意对此进行更多的澄清。提前感谢您的时间和精力

编辑: 我注意到只有一些文件的第16列被作为字符串读入。我认为这是因为其中有一些NaN值,但我可能错了


这显示了指出NaN值的原始数据。显示特定列被读取为字符串的演示可以。但是,另一列被读取为float:。

克服缺少值的方法很简单,pandas.read\u csv有一个名为
na\u values
的参数,允许用户传递他们希望读取为
NaNs
的指定值。从
pandas
文档:

na_值:标量、str、类似列表或dict,默认为无

要识别为NA/NaN的其他字符串。如果dict通过,则指定每列NA值。默认情况下,以下值被解释为NaN:“…”不,…`

熊猫本身足够聪明,能够自动识别这些价值观,而无需我们明确说明。但在我的例子中,文件的
nan
值为
'nan'
(是的,有空格!),这就是我面临这个问题的原因。代码中的一个小改动修复了这个问题

pd.read_csv(z.open(EvoHist[i]), delimiter = "\t", 
compression='gzip', header=None, na_values = 'nan ').to_numpy()

从您的文件中包含两行具有代表性的行(特别是那些您发现有
NaN
值的行,它们是如何表示的?)会对您的问题有很大帮助。并不是每个人都想要或能够从谷歌硬盘下载东西,根据堆栈溢出规则,问题应该尽可能独立。这也极不可能是相关的,这应该纯粹是关于
read\u csv
to\u numpy
@Amadan抱歉,这是我第一次发布问题。谢谢你的指导。我补充了一些东西。我还打算删除不相关的gzip信息。但我偶然发现,要克服我所面临的困难,需要做些什么。我是现在就删除我的问题,还是应该给它添加一个解决方案?删除问题最终会导致被拒绝提问(好吧,我相信这不是一个问题,因为它没有被否决,但比抱歉更安全:)。所以我绝对建议提供答案。这甚至可能会为你赢得一些声誉。(不用担心,每个人都是新的。)@Amadan谢谢,很快就会添加解决方案:)@Amadan一点也不担心。现在已经贴了。谢谢你的帮助,你开启了我的旅程:)