【问题标题】:Pandas: Read csv with dtypes but mixed type columns(NA values)Pandas:使用 dtypes 但混合类型列读取 csv(NA 值)
【发布时间】:2020-12-28 19:40:41
【问题描述】:

我试图在读取它的过程中向下转换 csv 的列,因为在读取文件后这样做太耗时了。到目前为止,一切都很好。如果一列具有 NA 值,当然会出现问题。是否有可能忽略它或在阅读过程中过滤那些可能使用熊猫读取csv的转换器输入? “冗长”的论点有什么作用?文档说明了一些关于指示放置在非数字列中的 NA 值的数量。

到目前为止,我的向下转换方法是读取前两行并猜测 dtype。在读取整个 csv 时,我为 dtype 参数创建了一个映射字典。当然,NaN 值可能会出现在稍后的行中。因此,可能会出现混合数据类型:

import pandas as pd

df = pd.read_csv(filePath, delimiter=delimiter, nrows=2, low_memory=True, memory_map=True,engine='c')

if downcast == True:
    mapdtypes = {'int64': 'int8', 'float64': 'float32'}
    dtypes = list(df.dtypes.apply(str).replace(mapdtypes))
    dtype = {key: value for (key, value) in enumerate(dtypes)}
    df = pd.read_csv(filePath, delimiter=delimiter, memory_map=True,engine='c', low_memory=True, dtype=dtype)

【问题讨论】:

  • 你能把那些 NA 值设置为其他类型,例如0s 或 None
  • 你的意思是我在阅读过程中是否可以,或者我在创建文件时是否可以这样做?
  • 我不明白你的意思。我尝试通过仅读取前两行来猜测 dtypes。然后在读取整个csv时为dtype参数创建一个dtype映射dict
  • 愚蠢的我,我忽略了这一点。但是,当猜测错误时,您希望发生什么?

标签: python pandas downcast


【解决方案1】:

不确定我是否正确理解了您的问题,但您可能正在寻找 na_values 参数,您可以在其中指定一个或多个要识别为 NaN 值的字符串。

编辑:从各个列中获取 dtype 并将它们保存到字典中以进行向下转换。同样,如果需要,您可以限制读取到 df 的行数。

import csv

# get only the column headers from the csv:
with open(filePath, 'r') as infile:
    reader = csv.DictReader(infile)
    fieldnames = reader.fieldnames

# iterate through each column to get the dtype:
dtypes = {}
for f in fieldnames:
    df = pd.read_csv(filePath, usecols=[f], nrows=1000)
    dtypes.update({f:str(df.iloc[:,0].dtypes)})

【讨论】:

  • 不幸的是没有。问题是 NaN 值在我的数据框中。在检查我的数据框的前两行以获取数据类型时,当然其他行可能在列中包含 NaN 值。所以列是混合类型的。类似于具有 NaN 值的字符串列。并且整列不能转换为字符串。如果第一行列具有 NaN 值,则 dtype 为浮点数。但后来整个专栏只有字符串。字符串不能转为浮点数等
  • 你可以增加行数来获取数据类型吗?如果没有,那么我建议逐列阅读 csv,获取各个列的 `dtype` 并将它们保存到字典中,您可以稍后将其用于向下转换 - 请查看编辑后的答案.
【解决方案2】:

最初的问题与this one 相关,所以用类似的信息回答。 Pandas v1.0+“整数数组”数据类型可以满足您的要求。使用类型的大写版本,例如“Int16”等。Pandas .isnull() 可以识别缺失值。这是一个例子。注意 Pandas 特有的 Int16 数据类型 (Pandas Documentation) 中的大写字母“I”。

import pandas as pd
import numpy as np

dftemp = pd.DataFrame({'int_col':[4,np.nan,3,1],
                      'float_col':[0.0,1.0,np.nan,4.5]})

#Write to CSV (to be read back in to fully simulate CSV behavior with missing values etc.)
dftemp.to_csv('MixedTypes.csv', index=False)

lst_cols = ['int_col','float_col']
lst_dtypes = ['Int16','float']
dict_types = dict(zip(lst_cols,lst_dtypes))

#Unoptimized DataFrame    
df = pd.read_csv('MixedTypes.csv')
df

结果:

   int_col  float_col
0      4.0        0.0
1      NaN        1.0
2      3.0        NaN
3      1.0        4.5

重复分配变量类型 -- 包括 Int16 用于 int_col

df2 = pd.read_csv('Data.csv', dtype=dict_types)
print(df2)


   int_col  float_col
0        4        0.0
1     <NA>        1.0
2        3        NaN
3        1        4.5

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 2012-09-06
    • 2020-08-06
    • 2016-07-11
    • 1970-01-01
    • 2018-04-27
    • 2014-03-26
    • 2019-02-02
    • 2021-01-07
    相关资源
    最近更新 更多