【问题标题】:dtype is ignored when using multilevel columns使用多级列时忽略 dtype
【发布时间】:2019-02-14 21:44:11
【问题描述】:

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

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

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)
    <i># full column name tuples with level 0/1 labels don't work</i>
    df_new= pd.read_csv(
        'test_df.csv',
        header=list(range(2)),
        dtype = {
            ('A', 'int16'): 'int16', 
            ('A', 'int32'): 'int32'
        })
    print(df_new.dtypes)
    <i># using the level 0 labels for dtype= seems to work</i>
    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) 相同的列类型,但它似乎根本没有使用 dtype= 参数并推断出导致更多内存密集型类型的类型.

我错过了什么吗?

提前谢谢乔特贝

【问题讨论】:

  • 在 1.2.2 版本中,这个问题仍然存在。但它似乎只影响c引擎。如果指定engine='python',则正确应用类型。

标签: pandas csv dataframe header


【解决方案1】:

这是一个错误,也存在于当前版本的 pandas 中。我提交了一个错误报告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 中指定的一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 2021-05-21
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多