如何提取Python pandas数据框的特定列的特定位

时间:2019-03-21 10:12:25

标签: python pandas dataframe

对于熊猫数据框的特定列, 该列实际上是转换为BCD的16位数据。 我只想提取特定行的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为基数的int()无效文字“

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跟踪(最近一次通话最近)    在         1 df.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

     

在apply(self,func,convert_dtype,args,** kwds)中的C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ series.py      3192其他:      3193个值= self.astype(object).values   -> 3194映射= lib.map_infer(values,f,convert = convert_dtype)      3195      3196如果len(mapped)和isinstance(mapped [0],Series):

     

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

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ series.py in(x)      3179#处理ufuncs和lambdas      3180如果kwds或args而不是isinstance(func,np.ufunc):   -> 3181 f = lambda x:func(x,* args,** kwds)      3182其他:      3183 f = func

     

ValueError:以int 2为基数的int()无效文字”

请帮助

1 个答案:

答案 0 :(得分:0)

您有一个值0,因此当您将此值转换为bin时,0变为0b0,因此使用提取str[2:].str[:-8]时就没有值。

我建议您在提取到填充0的填充之间应用zfill(16):

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: ''