Chcę ustawić dtype
s wielu kolumn w pd.Dataframe
(mam plik, który musiałem ręcznie przeanalizować na listę list, ponieważ plik nie był przystosowany pd.read_csv
)
import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
dtype={'x':'object','y':'int'},
columns=['x','y'])
dostaję
ValueError: entry not a 2- or 3- tuple
Jedynym sposobem, w jaki mogę je ustawić, jest zapętlenie każdej zmiennej kolumny i przekształcenie za pomocą astype
.
dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
columns=['x','y'])
for c in mydata.columns:
mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype #=> int64
Czy jest lepszy sposób?
df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])
"działa" ... ale: sOdpowiedzi:
Od wersji 0.17 musisz używać jawnych konwersji:
(Jak wspomniano poniżej, „magia”
convert_objects
nie jest już używana w wersji 0.17)Możesz je zastosować do każdej kolumny, którą chcesz przekonwertować:
i potwierdź, że dtype jest zaktualizowany.
ODPOWIEDŹ STARA / WYCOFANA dla pand 0,12 - 0,16: Możesz użyć,
convert_objects
aby wywnioskować lepsze typy:Magia! (Szkoda, że to przestarzałe.)
źródło
type.convert
trochę jak w R; fajne, ale w niektórych przypadkach pozostawia ochotę na wyraźne specyfikacje.convert_objects()
że jest przestarzały ... nie jestem pewien, co go zastąpiło?Dla osób pochodzących z Google (itp.), Takich jak ja:
convert_objects
jest przestarzały od 0.17 - jeśli go użyjesz, otrzymasz ostrzeżenie takie jak to:Powinieneś zrobić coś takiego:
df =
df.astype(np.float)
df["A"] =
pd.to_numeric(df["A"])
źródło
pd.to_datetime, to_timedelta, to_numeric
powinna to być akceptowana odpowiedź.możesz jawnie ustawić typy za pomocą pand
DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
i przekazać do słownika te typy, które chceszdtype
oto przykład:
teraz widać, że to się zmieniło
źródło
Innym sposobem ustawienia typów kolumn jest najpierw skonstruowanie tablicy rekordów numpy z żądanymi typami, wypełnienie jej, a następnie przekazanie do konstruktora DataFrame.
źródło
masz podobny problem. W moim przypadku mam tysiące plików z dzienników Cisco, które muszę przeanalizować ręcznie.
Aby być elastycznym z polami i typami, pomyślnie przetestowałem przy użyciu StringIO + read_cvs, który rzeczywiście akceptuje dyktowanie dla specyfikacji dtype.
Zwykle umieszczam każdy z plików (5k-20k wierszy) w buforze i dynamicznie tworzę słowniki dtype.
Ostatecznie konkatenuję (z kategorycznym ... dzięki 0.19) te ramki danych do dużej ramki danych, którą wrzucam do hdf5.
Coś w tym stylu
Niezbyt pytoniczne ... ale spełnia swoje zadanie
Mam nadzieję, że to pomoże.
JC
źródło
Lepiej jest użyć wpisanego np.arrays, a następnie przekazać dane i nazwy kolumn jako słownik.
źródło