При использовании DataFrame.read_csv с многоуровневыми столбцами (читается с header=
) панды, похоже, игнорируют ключевое слово dtype=
.Есть ли способ заставить панд использовать переданные типы?Я читаю большие наборы данных из CSV и поэтому пытаюсь прочитать данные уже в правильном формате для экономии ресурсов процессора и памяти.
Я попытался передать dict, используя dtype с кортежами и строками.Кажется, что dtype ожидает строки.По крайней мере, я заметил, что если я пройду ключи уровня 0, типы будут назначены, но, к сожалению, это будет означать, что все столбцы с одинаковой меткой уровня 0 получат одинаковый тип.В приведенном ниже примере столбцы (A, int16) и (A, int32) получат тип , объект , а (B, float32) и (B, int16) получат float32 . * 1009.*
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=
ивыводит типы, что приводит к гораздо более интенсивным типам памяти.
Я что-то упустил?
Заранее спасибо Jottbe