【问题标题】:Python Pandas New Column based on values from other columnsPython Pandas 新列基于其他列的值
【发布时间】:2020-07-10 01:37:14
【问题描述】:

我有一个看起来像这样的 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  <---   

【问题讨论】:

    标签: python pandas data-transform


    【解决方案1】:

    让我们试试 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
    

    【讨论】:

    • 它可以工作,但不应该这样做bb --&gt; b2 &amp; ch --&gt; c2 。它们应该保持原样,并且只有在T0找到新名称时才更改它
    猜你喜欢
    • 2022-11-18
    • 2018-09-26
    • 2021-12-30
    • 2019-01-10
    • 2015-03-30
    • 2020-11-01
    • 2018-02-19
    • 2019-04-03
    • 2016-02-10
    相关资源
    最近更新 更多