Создать новый столбец в зависимости от значений из другого столбца - PullRequest
0 голосов
/ 02 июля 2018

У меня есть DataFrame, который выглядит примерно так:

import numpy as np
import pandas as pd

df=pd.DataFrame([['vt 40462',5,6],[5,6,6],[5,5,8],[4,3,1],['vl 6450',5,6],[5,6,7],
             [1,2,3],['vt 40462',5,6],[5,5,8],['vl 658',6,7],[5,5,8],[4,3,1],['vt 40461',5,6],[5,5,8],
             [7,8,5]],columns=['A','B','C'])

DF

         A  B  C
0 vt 40462  5  6
1        5  6  6
2        5  5  8
3        4  3  1
4  vl 6450  5  6
5        5  6  7
6        1  2  3
7  vt 40462  5  6
8        5  5  8
9   vl 658  6  7
10       5  5  8
11       4  3  1
12 vt 40461 5  6
13        5 5  8
14        7 8  5

Я хочу дать индексам значения от vt до vl в столбце A и создать новые столбцы в виде:

         A  B  C  D
0 vt 40462  5  6  vt 40462
1        5  6  6  vt 40462
2        5  5  8  vt 40462
3        4  3  1  vt 40462
4  vl 6450  5  6  vl 6450
5        5  6  7  vl 6450
6        1  2  3  vl 6450
7 vt 40462  5  6  vt 40462
8        5  5  8  vt 40462
9   vl 658  6  7  vl 658
10       5  5  8  vl 658
11       4  3  1  vl 658
12 vt 40461 5  6  vt 40461
13        5 5  8  vt 40461
14        7 8  5  vt 40461

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Другим способом было бы assign столбец D, чтобы все значения A начинались с буквы, а затем использовать df.ffill(), чтобы избавиться от NaN s:

df.assign(D=df.loc[df.A.str.contains('^[A-Za-z]', na=False), 'A']).ffill()


           A  B  C         D
0   vt 40462  5  6  vt 40462
1          5  6  6  vt 40462
2          5  5  8  vt 40462
3          4  3  1  vt 40462
4    vl 6450  5  6   vl 6450
5          5  6  7   vl 6450
6          1  2  3   vl 6450
7   vt 40462  5  6  vt 40462
8          5  5  8  vt 40462
9     vl 658  6  7    vl 658
10         5  5  8    vl 658
11         4  3  1    vl 658
12  vt 40461  5  6  vt 40461
13         5  5  8  vt 40461
14         7  8  5  vt 40461

Или, более или менее эквивалентно, но в 2 этапа:

df.loc[df.A.astype(str).str.contains('^[A-Za-z]'), 'D'] = df.A

df.ffill()
0 голосов
/ 02 июля 2018

Используйте str.split, если '' не найден, он возвращает NaN, используйте ffill, чтобы заполнить NaN и объединить поля вместе и присвоить 'D':

#Thanks @user3483203 for the upgrade in syntax
df['D'] = df['A'].str.split().ffill().apply(' '.join)
print(df)

Выход:

          A  B  C         D
0   vt 40462  5  6  vt 40462
1          5  6  6  vt 40462
2          5  5  8  vt 40462
3          4  3  1  vt 40462
4    vl 6450  5  6   vl 6450
5          5  6  7   vl 6450
6          1  2  3   vl 6450
7   vt 40462  5  6  vt 40462
8          5  5  8  vt 40462
9     vl 658  6  7    vl 658
10         5  5  8    vl 658
11         4  3  1    vl 658
12  vt 40461  5  6  vt 40461
13         5  5  8  vt 40461
14         7  8  5  vt 40461
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...