Python Pandas Новый столбец на основе значений из других столбцов - PullRequest
0 голосов
/ 10 июля 2020

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

Каждый идентификатор имеет количество столбцов. Лог c должен посмотреть на T1 и проверить, была ли программа замечена в T0. На основании результатов будет создан новый столбец. Если он находится в T0, новый столбец будет иметь такой же name. Если он не отображается в момент T0, то name увеличивается, поэтому он будет _2.

Python

data = '''id, name, Time, program
1, bb, T0, a1 
1, ch, T0, a1
1, cc, T0, b1
1, ch_1, T1, a1
1, ch_1, T1, a2
1, ch_1, T1, a3
1, ch_1, T1, a4
1, cc_1, T1, b1
1, cc_1, T1, b2
1, cc_1, T1, b3
2, dd, T0, c1
2, ch, T0, a1
2, cc, T0, b1
2, ch_1, T1, a1
2, ch_1, T1, a2
2, ch_1, T1, a3
2, cc_1, T1, b1
2, cc_1, T1, b2
2, cc_1, T1, b3'''
da = [[i.strip() for i in l.split(",")] for l in data.split("\n")]
df = pd.DataFrame(da[1:], columns=da[0])

Вывод

id      name        Time      program 
1        bb          T0        a1   
1        ch          T0        a1      
1        cc          T0        b1      
1        ch_1        T1        a1      
1        ch_1        T1        a2      
1        ch_1        T1        a3     
1        ch_1        T1        a4   
1        cc_1        T1        b1      
1        cc_1        T1        b2      
1        cc_1        T1        b3 
2        dd          T0        c1     
2        ch          T0        a1      
2        cc          T0        b1      
2        ch_1        T1        a1      
2        ch_1        T1        a2      
2        ch_1        T1        a3      
2        cc_1        T1        b1      
2        cc_1        T1        b2      
2        cc_1        T1        b3 

Вот окончательный ожидаемый результат.

id      name         Time      program    new_name
1        bb           T0        a1          bb
1        ch           T0        a1          ch                      
1        cc           T0        b1          cc                      
1        ch_1         T1        a1          ch_1                  
1        ch_1         T1        a2          ch_2  <--- 
1        ch_1         T1        a3          ch_2  <---
1        ch_1         T1        a4          ch_2  <---  
1        cc_1         T1        b1          cc_1                 
1        cc_1         T1        b2          cc_2  <--- 
1        cc_1         T1        b3          cc_2  <---
2        dd           T0        c1          dd
2        ch           T0        a1          ch                      
2        cc           T0        b1          cc                      
2        ch_1         T1        a1          ch_1                  
2        ch_1         T1        a2          ch_2  <--- 
2        ch_1         T1        a3          ch_2  <--- 
2        cc_1         T1        b1          cc_1                 
2        cc_1         T1        b2          cc_2  <--- 
2        cc_1         T1        b3          cc_2  <---   

1 Ответ

0 голосов
/ 10 июля 2020

Попробуем apply + np.where, не быстро, но работает

s=df.groupby('id').apply(lambda x : x['Time'].eq('T1') & ~x['program'].isin(x['program'][x['Time'].eq('T0')])).reset_index(level=0,drop=True)
df['New Name']=np.where(s, df['name'].str[:-1]+'2', df['name'])

df
    id  name Time program New Name
0    1    bb   T0      a1       bb
1    1    ch   T0      a1       ch
2    1    cc   T0      b1       cc
3    1  ch_1   T1      a1     ch_1
4    1  ch_1   T1      a2     ch_2
5    1  ch_1   T1      a3     ch_2
6    1  ch_1   T1      a4     ch_2
7    1  cc_1   T1      b1     cc_1
8    1  cc_1   T1      b2     cc_2
9    1  cc_1   T1      b3     cc_2
10   2    dd   T0      c1       dd
11   2    ch   T0      a1       ch
12   2    cc   T0      b1       cc
13   2  ch_1   T1      a1     ch_1
14   2  ch_1   T1      a2     ch_2
15   2  ch_1   T1      a3     ch_2
16   2  cc_1   T1      b1     cc_1
17   2  cc_1   T1      b2     cc_2
18   2  cc_1   T1      b3     cc_2
...