使用多级列时会忽略dtype

时间:2019-02-14 21:44:11

标签: pandas csv dataframe header

在将DataFrame.read_csv用于多级列(以U读取)时,熊猫似乎忽略了header=关键字。 有没有办法让熊猫使用传递的类型? 我正在从CSV读取大型数据集,因此尝试以正确的格式读取数据,以节省CPU和内存。

我尝试使用带有元组和字符串的dtype传递字典。似乎dtype需要字符串。至少我观察到,如果我通过了0级键,则会为类型分配类型,但是不幸的是,这意味着所有具有相同0级标签的列都将获得相同的类型。在下面的esample中,列(A,int16)和(A,int32)将获得 object 类型,而(B,float32)和(B,int16)将获得 float32

dtype=

我希望第二个 import pandas as pd df= pd.DataFrame({ ('A', 'int16'): pd.Series( [1, 2, 3, 4], dtype='int16'), ('A', 'int32'): pd.Series( [132, 232, 332, 432], dtype='int32'), ('B', 'float32'): pd.Series( [1.01, 1.02, 1.03, 1.04], dtype='float32'), ('B', 'int16'): pd.Series( [21, 22, 23, 24], dtype='int16')}) print(df) df.to_csv('test_df.csv') print(df.dtypes) # full column name tuples with level 0/1 labels don't work df_new= pd.read_csv('test_df.csv', header=list(range(2)), dtype={ ('A', 'int16'): 'int16', ('A', 'int32'): 'int32'}) print(df_new.dtypes) # using the level 0 labels for dtype= seems to work df_new2= pd.read_csv('test_df.csv', header=list(range(2)), dtype={ 'A':'object', 'B': 'float32'}) print(df_new2.dtypes) 输出与第一个print(df.dtypes)相同的列类型,但是它似乎根本不使用print(df.dtypes)参数并推断出结果类型更多的内存密集型。

我想念什么吗?

预先感谢乔特(Jottbe)

1 个答案:

答案 0 :(得分:0)

这是一个错误,在当前版本的熊猫中也存在。我提交了错误报告 here

但对于当前版本,还有一个解决方法。如果引擎切换到python,它可以完美运行:

df_new= pd.read_csv(
    'test_df.csv',
    header=list(range(2)),
    engine='python',
    dtype = {
        ('A', 'int16'): 'int16', 
        ('A', 'int32'): 'int32'
    })
print(df_new.dtypes)

输出为:

Unnamed: 0_level_0  Unnamed: 0_level_1      int64
A                   int16                   int16
                    int32                   int32
B                   float32               float64
                    int16                   int64

因此,“A 列”按照 dtypes 中的指定进行键入。