Векторизация с Pandas - PullRequest
       9

Векторизация с Pandas

1 голос
/ 15 марта 2020

У меня есть pandas кадр данных, как показано ниже:

   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 в хронологическом порядке.

Для среднего ряда

Я хочу указать, под каким TCase хранится каждый K, т. Е. T1 состоит из K1, K4, K8 ...

Bottom Row

Аналогично среднему ряду, но с обозначением MSuite.

Matrix 2 - V Matrix

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

Top Row

Аналогично верхней строке в Matrix 1, где у меня есть отдельный файл со списком всех различных V # доступно, и я хотел бы просто получить индекс файла V #, который совпадает с индексом в кадре данных.

Средняя строка

Индекс V # в каждой группе T #, т. Е. В T1, V3 - 4-й KWord, а для T2 V10 - 3-й KWord.

Bottom Row

Обозначает, к какому MSuite относится V #. т.е. V3 в T1, а также V10 в T2 оба подпадают под MS1 -> 1, в то время как V3 в T3 и V6 в T4 оба подпадают под MS2 -> 2.

Попытка пока что

Я начал с циклического перебора данных, но наткнулся на это совет. Так что теперь мне интересно, нужно ли мне как-то реализовать векторизацию, но я действительно не знаю, с чего начать.

Если бы не векторизация, я бы продолжил l oop через фрейм данных, при этом кэшируя при каждом увеличении MSuite и TCase и добавляя кешированные значения.

1 Ответ

2 голосов
/ 15 марта 2020

Вы можете попробовать строка, содержащая вместе с извлечение строки , чтобы добиться этого

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

Out:

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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...