我有一个如下所示的熊猫数据框:
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, 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表示。
[[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处增加缓存,并附加缓存的值。
答案 0 :(得分:2)
您可以尝试将string contain与string 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]])