Python 熊猫矢量化

Python 熊猫矢量化,python,pandas,dataframe,vectorization,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 N

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

   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矩阵 第一排 每个K#存储在一个单独的数据帧/数组中,我想按时间顺序获取每个K的索引

中间一排 我想表示每个K存储在哪个TCase下,即T1由K1、K4、K8组成

底层 类似于中间行,但使用MSuite表示

矩阵2-V矩阵 第一排 与矩阵1中的第一行类似,我有一个单独的文件,其中包含所有可用的V#的列表,我只想获取文件V#的索引,该索引与数据框中的索引相同

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

底层 表示V#所属的M套件。 i、 T1中的e V3以及T2中的V10都属于MS1->1,而T3中的V3和T4中的V6都属于MS2->2

迄今为止的尝试 我开始循环遍历数据帧,但遇到了这个问题 所以现在我想知道我是否需要以某种方式实现矢量化,但我真的不知道从哪里开始

如果不是矢量化,我将继续在数据帧中循环,同时在每次MSuite和TCase增加时进行缓存,并附加缓存的值

您可以尝试使用with来实现这一点

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')
输出:


看起来很漂亮。我对process函数的第一行有点迷茫,您在哪里找到提取方法的模式?谢谢你的回答,因为它看起来是正确的,但是如果你能对代码稍加评论,让我知道你到底在做什么,那就太棒了。谢谢。哦,等等,不,是你编辑的。。忽略注释^^谢谢。非常好+1,我有一个类似的方法,唯一的更改是:
df=df[df.KWord.str.contains(Char,na=False)]:return df.stack().str.extract('(\d+),expand=False)。astype(int)。unstack().to_numpy().T[:-1]
:)谢谢@anky\u 91,几乎类似的方法:)我喜欢这个想法,但我想指出的是,K1和K2并不是简单地删除字母,然后保留数字。它们对应于我想提及的不同数据框中的项目,即有一个包含所有K的数据框,然后我想从该数据框中获取索引,并在最终矩阵中使用该值。
 [[3, 10, 3, 6],
 [4,  3, 3, 5], 
 [1,  1, 2, 2]]
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]])