0

我有一个看起来像这样的 DF。

每个 id 都有列数。逻辑是查看 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  <---   
4

1 回答 1

0

让我们试试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
于 2020-07-10T01:48:43.033 回答