【发布时间】: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