如果列之一(即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
答案 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']))