如何基于数据框中的列条件应用函数

时间:2019-11-29 12:19:10

标签: python pandas

如果列之一(即df ['mask']包含False),我尝试在数据框的列上应用函数,则应跳过该行。掩码列为布尔型

这是我的功能

     def dates(inp):
        temp = inp
        parser = CommonRegex()
        inp = inp.apply(parser.dates).str.join(', ')
        return np.where(inp.apply(parser.dates).str.len() == 0, temp, 'X' * random.randrange(3, 8)) 

这里我申请了

      df1.assign(**df1['Dates'].apply(dates).where(df1['mask']== TRUE))

它抛出错误

         32     temp = inp
         33     parser = CommonRegex()
    ---> 34     inp = inp.apply(parser.dates).str.join(', ')
         35     return np.where(inp.apply(parser.dates).str.len() == 0, temp, 'X' * random.randrange(3, 8))
         36 

    AttributeError: 'Timestamp' object has no attribute 'apply'    

这是我的数据框的样子

         Name     |  Dates   |  mask |
         ..............................
         Tom      | 21/02/2018| True
         Nick     | 28/07/2018| False
         Juli     | 11/08/2018| True
         June     | 01/02/2018| True
         XHGM     | 07/08/2018| False   

我试图以这种方式获取输出,对于假​​值,应跳过;对于真值,应调用日期函数并隐藏数据值。

         Name     |  Dates   |  mask |
         ..............................
         Tom      | XXXXX     | True
         Nick     |28/07/2018 | False
         Juli     | XXXXX     | True
         June     | XXXXX     | True
         XHGM     | 07/08/2018| False     

1 个答案:

答案 0 :(得分:1)

使用Series.pipe使传递列起作用,并使用掩码boolean indexing和行DataFrame.loc过滤行以指定列名:

df1.loc[df1['mask'], 'Dates'] = df1.loc[df1['mask'], 'Dates'].pipe(dates)
print (df1)
   Name       Dates   mask
0   Tom         XXX   True
1  Nick  28/07/2018  False
2  Juli         XXX   True
3  June         XXX   True
4  XHGM  07/08/2018  False

也可以使用assign解决方案,但是缺点是所有值都将进行功能循环,然后进行过滤,因此,如果在大True中只有几个Dataframe的值,则速度会变慢:

df1 = df1.assign(Dates = np.where(df1['mask'], df1['Dates'].pipe(dates), df1['Dates']))