根据熊猫中的列索引在csv文件导入期间定义数据类型

时间:2018-10-23 21:53:47

标签: python pandas

我需要导入一个包含300多个列的csv文件,在这些列中,仅第一列需要指定为类别,而其余列的浮点数应为32或更少。我猜想我可以通过列索引指定列的数据类型。我的问题是:基于列索引指定数据类型的最佳方法是什么?

DatumReader

我尝试的代码是:

Col_A   Col_B   Col_C   Col_D
001       1       2      1.2
002       2       3      3.5
003       3       4.5      7
004       4       6.5     10

3 个答案:

答案 0 :(得分:1)

读取两次,第一次获取所有列,第二次读取时指定dtype。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
df.to_csv('tmp.csv',index=False)

path = 'tmp.csv'
df =pd.read_csv(path)
type_dict = {}

for key in df.columns:
    if key == 'A':
        type_dict[key]='category'
    else:
        type_dict[key]=np.float32
df = pd.read_csv(path,dtype=type_dict)
print(df.dtypes)

答案 1 :(得分:1)

有两种情况:

  1. 您知道并且可以预先为每列指定最佳类型;或
  2. 您事先不知道最佳类型,因此必须在读取文件后 转换为最佳类型。

提前指定

这是简单的情况。使用字典:

type_dict = {'Col_A': 'category', 'Col_B': 'int16',
             'Col_C': 'float16', 'Col_D': 'float32'}

df = pd.read_csv(myfile, delim_whitespace=True, dtype=type_dict)

如果您事先不知道列名,则只需阅读列即可作为第一步:

cols = pd.read_csv(myfile, delim_whitespace=True, nrows=0).columns
# Index(['Col_A', 'Col_B', 'Col_C', 'Col_D'], dtype='object')

type_dict = {'Col_A': 'category', **{col: 'float32' for col in cols[1:]}}

df = pd.read_csv(myfile, delim_whitespace=True, dtype=type_dict)

阅读后指定

通常您不会事先知道最优类型。在这种情况下,您可以正常读取数据并在后续步骤中显式执行intfloat的转换:

df = pd.read_csv(myfile, delim_whitespace=True, dtype={'Col_A': 'category'})

cols = {k: df.select_dtypes([k]).columns for k in ('integer', 'float')}

for col_type, col_names in cols.items():
    df[col_names] = df[col_names].apply(pd.to_numeric, downcast=col_type)

print(df.dtypes)

Col_A    category
Col_B        int8
Col_C     float32
Col_D     float32
dtype: object

用于测试的设置

from io import StringIO

myfile = StringIO("""Col_A   Col_B   Col_C   Col_D
001       1       2      1.2
002       2       3      3.5
003       3       4.5      7
004       4       6.5     10""")

答案 2 :(得分:1)

我认为以下将达到目的:

df = pd.read_csv(path, low_memory=False, dtype={'Col_A':'category'})

或者如果您知道它将是第一列:

df = pd.read_csv(path, low_memory=False, dtype={0:'category'})