簡體   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