Как извлечь конкретные биты из определенного столбца данных Python в Python - PullRequest
0 голосов
/ 21 марта 2019

Для определенного столбца pandas dataframe этот столбец на самом деле представляет собой 16-битные данные, преобразованные в BCD.Я хочу извлечь только бит 14-8 определенной строки и преобразовать в BCD.Приведенная ниже формула работает для небольшого фрейма данных, как показано ниже.

df=pd.DataFrame({'Value':[128,128,436,465], 'Minutes':[1280,16384,1792,1536] })

df['Minutes_1']=df.Minutes.apply(int).apply(bin).str[2:].str[:-8].apply(int, base=2)
df

Но когда я применяю

df['Minutes_1']=df.Minutes.apply(int).apply(bin).str[2:].str[:-8].apply(int, base=2)

для большего фрейма данных из 688126 строк, я получаю сообщение об ошибке

недопустимый литерал для int () с основанием 2: ''

Note:  Few values of the row are 
0, 256,512,768,1024,1280,1536,1792,2048,2304,4096,4352,4608,4864,
5120,5276,5632,5888,6144,6400,8192,8448,8704,8960,9216,9472,9728,9984,10240,10496,12288,
12544,12800,13056,13312,13568,13824,14080,14336,14592,16384,16640,16896,17152,17408,17920,
18176,18432,18688,20480,20736,20992,21248,21504,21760,22016,22272,22528,22784

Ошибка, как показано ниже

ValueError Traceback (последний вызов последнего) в 1df.LO_TIME_0_J2_0 ----> 2 df ['Minutes_1'] = df.LO_TIME_0_J2_0.apply (int) .apply (bin) .str [2:]. str [: - 8] .apply (int, base = 2) 3 df.LO_TIME_0_J2_0

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ series.py в apply (self, func, convert_dtype, args, ** kwds) 3192 остальное: 3193values ​​= self.astype (object) .values ​​-> 3194 mapped = lib.map_infer (values, f, convert = convert_dtype) 3195 3196, если len (сопоставленный) и isinstance (сопоставленный [0], Series):

pandas / _libs / src \ inference.pyx в pandas._libs.lib.map_infer ()

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ series.py в (x)3179 # обрабатывать ufuncs и lambdas 3180, если kwds или argsd is isinstance (func, np.ufunc): -> 3181 f = лямбда-x: func (x, * args, ** kwds) 3182 else: 3183 f = func

ValueError: недопустимый литерал для int () с основанием 2: ''

Пожалуйста, помогите

1 Ответ

0 голосов
/ 21 марта 2019

у вас есть значение 0, поэтому при преобразовании этого значения в bin 0 становится 0b0, поэтому при извлечении str[2:].str[:-8] у вас нет значения.

Я предлагаю вам применить zfill (16) между извлечениемдля заполнения 0:

df['Minutes_1'] = df.Minutes.apply(int).apply(bin).str[2:].str.zfill(16).str[:-8].apply(int, base=2)

возможно использование astype быстрее, чем apply (int):


df['Minutes_1'] = df.Minutes.astype(int).apply(bin).str[2:].str.zfill(16).str[:-8].apply(int, base=2)

Пример:

df = pd.DataFrame( {'Minutes': [1280, 16384, 1792, 1536, 0, 256]})                                    
df['Minutes_1'] = df.Minutes.apply(int).apply(bin).str[2:].str.zfill(16).str[:-8].apply(int, base=2)  

вывод:

   Minutes  Minutes_1  
0     1280          5  
1    16384         64  
2     1792          7  
3     1536          6  
4        0          0  
5      256          1  

Без zfill вы получите ошибку:

ValueError: invalid literal for int() with base 2: ''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...