在将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)
答案 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
中的指定进行键入。