用熊猫矢量化

时间:2020-03-15 04:20:04

标签: python pandas dataframe vectorization

我有一个如下所示的熊猫数据框:

   MSuite  TCase   KWord  
 0 MS1     Nan     Nan     
 1 NaN     T1      NaN     
 2 NaN     NaN     K1  
 3 NaN     NaN     K4 
 4 NaN     NaN     K8 
 5 NaN     NaN     V3
 6 NaN     T2      NaN 
 7 NaN     NaN     K7 
 8 NaN     NaN     K12 
 9 NaN     NaN     V10 
10 MS2     NaN     NaN 
11 NaN     T3      NaN 
12 NaN     NaN     K22
13 NaN     NaN     K15    
14 NaN     NaN     V3 
15 NaN     T4      NaN 
16 NaN     NaN     K10 
17 NaN     NaN     K4 
18 NaN     NaN     K12
19 NaN     NaN     K2
20 NaN     NaN     V6   

我想将其拆分为以下矩阵:

矩阵1-K矩阵

[[1, 4, 8, 7, 12, 22, 15, 10, 4, 12, 2],  
 [1, 1, 1, 2,  2,  3,  3,  4, 4,  4, 4],
 [1, 1, 1, 1,  1,  2,  2,  2, 2,  2, 2]]

对于第一行

每个K#存储在一个单独的数据帧/数组中,我想按时间顺序获取每个K的索引。

对于中间行

我想表示每个K存储在哪个TCase下,即T1由K1,K4,K8 ...组成。

底行

类似于中间行,但以MSuite表示。

矩阵2-V矩阵

 [[3, 10, 3, 6],
 [4,  3, 3, 5], 
 [1,  1, 2, 2]]

第一排

类似于矩阵1的第一行,在这里我有一个单独的文件,其中列出了所有可用的V#,并且我想仅获取文件V#的索引,该索引与其中的一个相同。数据框。

中间行

每个T#组中V#的索引,即在T1中,V3是第四个KWord,对于T2,V10是第三个KWord。

底行

表示V#属于哪个MSuite。 即T1中的V3和T2中的V10都在MS1-> 1之下,而T3中的V3和T4中的V6都在MS2-> 2下。

尝试到目前为止

我从遍历数据框开始,但是遇到了这个word of advice. 因此,现在我想知道是否需要以某种方式实现矢量化,但是我真的不知道从哪里开始。

如果没有向量化,我将继续遍历数据帧,同时在每个MSuite和TCase处增加缓存,并附加缓存的值。

1 个答案:

答案 0 :(得分:2)

您可以尝试将string containstring extract一起使用来实现

def Process(df,Char):
    df = df.loc[df.KWord.fillna('').str.contains(Char)]
    return df.apply(lambda x: x.str.extract('(\d+)')[0].rename(x.name)).astype(int).T.values[::-1]
df = pd.read_clipboard()
df[['MSuite','TCase']] = df[['MSuite','TCase']].ffill()
Process(df,'K')

出局:

array([[ 1,  4,  8,  7, 12, 22, 15, 10,  4, 12,  2],
       [ 1,  1,  1,  2,  2,  3,  3,  4,  4,  4,  4],
       [ 1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2]])