Создание нового столбца на основе элемента следующей строки существующего столбца - PullRequest
0 голосов
/ 28 октября 2018

Я работаю над очисткой и реструктуризацией фрейма данных.

У меня есть следующий фрейм данных:

data= pd.DataFrame()
data['ID'] = [1,1,1,1,1,2,2,2,2,2]
data ['EventSecond'] = [1.5,2,2.5,3,3.8,4,4.8,6,7,8,]
data ['P1'] = ['A','B','C','D','E','F','A','D','E','G']
data ['Code'] = [12,13,16,9,9,0,4,13,14,16]
data ['status'] =['Pass','Pass','Pass','Pass','Pass','Pass','shot','shot','Pass','Pass']
data ['Accuracy']= ['Accurate','Accurate','Accurate','Accurate','Accurate','Not Accurate','Accurate','Accurate','Accurate','Not Accurate']

В этом фрейме данных у меня есть ID, Eventsecond и т. Д.Я хочу создать новый столбец P2 , который содержит элемент следующей строки столбца P1, если элемент столбца Точность равен Точность .Во-первых, если приведенный ниже столбец идентификатора отличается, я не буду брать элемент снизу и просто оставлю его пустым. Если Точность Не точная , я оставлю пустым для этой строки.

Дополнение к вопросу

Я возьму только те строки, в которых столбец состояния имеет значение Pass .

Ожидаемый результат этогоследующим образом:

enter image description here

Кто-нибудь может посоветовать это?Спасибо,

Zep.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Итак, сначала я бы создал P2 с shift из P1, а затем создал mask с вашими условиями, чтобы изменить значение в P2 на пустое с loc, например:

data['P2'] = data['P1'].shift(-1)
mask = ((data.Accuracy == 'Not Accurate') | 
        (data.status =='shot') | 
        (data.ID != data.ID.shift(-1)))
data.loc[mask,'P2'] = ''
print (data)
   ID  EventSecond P1  Code status      Accuracy P2
0   1          1.5  A    12   Pass      Accurate  B
1   1          2.0  B    13   Pass      Accurate  C
2   1          2.5  C    16   Pass      Accurate  D
3   1          3.0  D     9   Pass      Accurate  E
4   1          3.8  E     9   Pass      Accurate   
5   2          4.0  F     0   Pass  Not Accurate   
6   2          4.8  A     4   shot      Accurate   
7   2          6.0  D    13   shot      Accurate   
8   2          7.0  E    14   pass      Accurate  G
9   2          8.0  G    16   pass  Not Accurate   

РЕДАКТИРОВАТЬ: вы даже можете сделать это, используя numpy.where, как

import numpy as np
data['P2'] = np.where(mask, '', data.P1.shift(-1))
0 голосов
/ 28 октября 2018

IIUC, вам нужно groupby и transform:

mask = (data['status'].isin(['Pass','pass']))
data.loc[mask,'P2'] = data[mask].groupby('ID')['P1'].transform(lambda x: x.shift(-1))
data.loc[data['Accuracy']=='Not Accurate','P2'] = np.nan

ИЛИ с использованием только фильтров:

mask = (data['status'].isin(['Pass','pass']))
data.loc[mask,'P2'] = data.loc[mask,'P1'].shift(-1)
mask2 = data['ID'].ne(data['ID'].shift(-1))|data['status'].eq('shot')|data['Accuracy'].eq('Not Accurate')
data.loc[mask2,'P2'] = ''

print(data)
   ID  EventSecond P1  Code status      Accuracy   P2
0   1          1.5  A    12   Pass      Accurate    B
1   1          2.0  B    13   Pass      Accurate    C
2   1          2.5  C    16   Pass      Accurate    D
3   1          3.0  D     9   Pass      Accurate    E
4   1          3.8  E     9   Pass      Accurate  NaN
5   2          4.0  F     0   Pass  Not Accurate  NaN
6   2          4.8  A     4   shot      Accurate  NaN
7   2          6.0  D    13   shot      Accurate  NaN
8   2          7.0  E    14   pass      Accurate    G
9   2          8.0  G    16   pass  Not Accurate  NaN

Вместо NAN, если вы чтопусто, затем используйте:

print(data.fillna(''))

   ID  EventSecond P1  Code status      Accuracy P2
0   1          1.5  A    12   Pass      Accurate  B
1   1          2.0  B    13   Pass      Accurate  C
2   1          2.5  C    16   Pass      Accurate  D
3   1          3.0  D     9   Pass      Accurate  E
4   1          3.8  E     9   Pass      Accurate   
5   2          4.0  F     0   Pass  Not Accurate   
6   2          4.8  A     4   shot      Accurate   
7   2          6.0  D    13   shot      Accurate   
8   2          7.0  E    14   pass      Accurate  G
9   2          8.0  G    16   pass  Not Accurate   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...