繁体   English   中英

Pandas:使用 dtypes 但混合类型的列(NA 值)读取 csv

[英]Pandas: Read csv with dtypes but mixed type columns(NA values)

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

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

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_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)})

最初的问题与这个有关,所以用类似的信息回答。 Pandas v1.0+“整数数组”数据类型可以满足您的要求。 使用类型的大写版本,例如“Int16”等。Pandas .isnull() 可以识别缺失值。 这是一个例子。 请注意 Pandas 特定的 Int16 数据类型( Pandas 文档)中的大写“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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM