2

我正在阅读一个大的 csv 文件。为了在读取时正确设置数据类型,我仅读取 5 行样本,然后获取 pandas 推断的 dtypes。然后,我想手动编辑它以正确配置数据类型,然后调用 read_csv 来读取完整文件。

然而,当我做df1.dtypes.to_dict()熊猫然后产生这个

{'Invoice Date': dtype('O'),
 'Invoice ID': dtype('O'),
 'Item ID': dtype('float64'),
 'Line Amount': dtype('float64'),
 'Line Amount Tax': dtype('float64')
}

我不想要那个 dtype,因为当我粘贴它以将其分配给我编辑的临时 dict 时出现错误。因此,我将此输出复制并粘贴到 VSCode,使用正则表达式提取以下输出:

{'Invoice Date': O,
 'Invoice ID': O,
 'Item ID': float64,
 'Line Amount': float64,
 'Line Amount Tax': float64
}

有没有办法直接在熊猫中得到这个?

4

2 回答 2

2

您可以将值转换为字符串并object使用Series.replace

df = pd.DataFrame({
        'A':list('abcdef'),
         'B':[4,5,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'D':[1,3,5.,7,1,0],
         'E':[5,3,6,9,2,4.],

    })

print (df.dtypes.astype(str).replace('object','O').to_dict())
{'A': 'O', 'B': 'int64', 'C': 'int64', 'D': 'float64', 'E': 'float64'}
于 2021-03-08T12:02:05.460 回答
1

你可以np.dtypes.nameSeries.map这里使用。

# Thanks to Jezrael for df
df = pd.DataFrame(
    {
        "A": list("abcdef"),
        "B": [4, 5, 4, 5, 5, 4],
        "C": [7, 8, 9, 4, 2, 3],
        "D": [1, 3, 5.0, 7, 1, 0],
        "E": [5, 3, 6, 9, 2, 4.0],
    }
)

df.dtypes.map(lambda x: x.name).to_dict()
# {'A': 'object', 'B': 'int64', 'C': 'int64', 'D': 'float64', 'E': 'float64'}

如果你想避免lambda,那么我们可以使用operator.attrgetter

from operator import attrgetter

dtype_getter = attrgetter('name')
df.dtypes.map(dtype_getter).to_dict()
# {'A': 'object', 'B': 'int64', 'C': 'int64', 'D': 'float64', 'E': 'float64'}
于 2021-03-08T12:26:26.793 回答