2016-06-21 3 views
4

У меня очень большой фреймворк данных, который я бы хотел избежать итерации через каждую строку и хочу преобразовать весь столбец из шестнадцатеричной строки в int. Он не обрабатывает строку правильно с помощью astype, но не имеет проблем с одной записью. Есть ли способ сказать astype, что тип данных является базой 16?convert pandas dataframe column from hex string to int

IN: 
import pandas as pd 
df = pd.DataFrame(['1C8','0C3'], columns=['Command0']) 
df['Command0'].astype(int) 
OUT: 
ValueError: invalid literal for int() with base10: '1C8' 

Это работает, но вы хотите избежать итерации строк.

for index, row in df.iterrows(): 
    print(row['Command0']) 

Я читаю это из CSV pd.read_csv(open_csv, nrows=20) так что если есть способ, чтобы прочитать его и явно сказать ему, что формат, то это было бы еще лучше!

ответ

5

Вы можете использовать apply.

df.Command0.apply(lambda x: int(x, 16)) 
>>> 
0 456 
1 195 
Name: Command0, dtype: int64 

И вы можете сделать это с помощью pd.read_csv вызова с помощью параметра converters:

df = pd.read_csv("path.txt", converters={"Command0": lambda x: int(x, 16)}) 
+1

Спасибо за ответ. Я также обнаружил, что до тех пор, пока вы явно укажете ему базу в случае конвертеров, вам не нужно применять «0x». 'df = pd.read_csv (open_csv, nrows = 20, converters = {'Command0': lambda x: int (x, 16)})' – kaminsknator