2013-09-29 3 views
3

Я хочу указать типы данных для pandas read_csv. Вот быстрый взгляд на то, что работает, а затем нет, когда указаны типы. Почему последние не работают?pandas string типы данных

import io 
import pandas as pd 

csv = """foo,1234567,a,1 
foo,2345678,b,3 
bar,3456789,b,5 
""" 

df = pd.read_csv(io.StringIO(csv), 
     names=["fb", "num", "loc", "x"]) 

print(df) 

df = pd.read_csv(io.StringIO(csv), 
     names=["fb", "num", "loc", "x"], 
     dtype=["|S3", "np.int64", "|S1", "np.int8"]) 

print(df) 

Обновлен, чтобы сделать это намного проще и, надеюсь, более ясным в предложении BrenBarn. Мой реальный набор данных намного больше, но я хотел бы использовать метод для создания типов для всех моих данных при импорте.

+1

Вы пытались сделать более простой набор данных и пытались использовать только один или два типа данных, чтобы узнать, какой из них вызывает проблему? – BrenBarn

+0

Я сделаю это, хотя ошибка, которую он бросает, теперь предлагает (моему новизну), что я не правильно указываю, а не что несоответствие между моей спецификацией и данными. Но я дам ему выстрел и отчитаю! – Don

+1

pandas преобразует указанный dtype строки, например '' S20'' в '' object'' dtype, который представляет типы строк. Почему это проблема? Это стандартный способ представления строк переменной длины (и на самом деле более эффективен, чем фиксированный '' S20'' dtype) – Jeff

ответ

5

Как указал Джефф, мой синтаксис был плохим. Названия и типы должны быть заархивированы в список отношений стиля dic. Код ниже работает, но обратите внимание, что вы не можете dtype ширину строки; вы можете определить его только как объект.

import pandas as pd 
import io 

csv = """foo,1234567,a,1 
foo,2345678,b,3 
bar,3456789,b,5 
""" 

df = pd.read_csv(io.StringIO(csv), 
     names = ["fb", "num", "ab", "x"], 
     dtype = {"fb" : object, "num" : np.int64, "ab" : object, "x" : np.int8}) 
print(df) 
+1

Правильно, вот почему я спрашивал об упрощении. Я думал, что если вы попытаетесь упростить его, вы, возможно, узнаете, что он вообще не работает, даже для числовых типов (хотя я точно не знал). По-прежнему кажется хромым, что вы не можете указывать фактический тип dtype. – BrenBarn

+1

pandas не поддерживает внутренние типы строк (на самом деле они всегда преобразуются в объект). – Jeff

Смежные вопросы