如何基于DataFrame的mask列条件应用函数?解决属性报错问题
解决AttributeError: 'Timestamp' object has no attribute 'apply'的问题
你的报错根源很明确:当你调用df1['Dates'].apply(dates)时,dates函数接收的参数inp是单个的Timestamp对象,而不是你预想的整个Series。单个Timestamp并没有apply方法,所以inp.apply(parser.dates)这行代码直接触发了AttributeError。
结合你的需求——仅对mask=True的行将Dates替换为3-8个随机长度的X字符串,mask=False的行保留原日期——我给你两种可行的解决方案:
方案1:简化逻辑,直接定位处理目标行
如果你的实际需求就是只要mask=True就替换(不需要额外判断日期提取结果),可以跳过自定义函数的复杂逻辑,直接用loc定位目标行赋值:
import numpy as np import random # 对mask为True的行,生成随机长度的X字符串 df1.loc[df1['mask'], 'Dates'] = [ 'X' * random.randrange(3, 8) for _ in range(df1['mask'].sum()) ]
这种方法更高效,避免了不必要的函数调用,完全符合你的示例期望输出。
方案2:修正自定义函数,适配单个元素处理
如果你需要保留dates函数中“提取日期后判断是否替换”的逻辑,需要修改函数让它能处理单个Timestamp对象(而不是Series):
from commonregex import CommonRegex import numpy as np import random def dates(inp): # 先把Timestamp转为字符串,方便CommonRegex处理 inp_str = str(inp) parser = CommonRegex() extracted_dates = parser.dates(inp_str) # 按原逻辑:提取到日期则返回随机X串,否则返回原内容 if len(extracted_dates) > 0: return 'X' * random.randrange(3, 8) else: return inp_str # 也可以返回原Timestamp:return inp # 使用np.where实现条件替换 df1['Dates'] = np.where(df1['mask'], df1['Dates'].apply(dates), df1['Dates'])
为什么这个方案能解决问题?
修改后的dates函数不再试图在单个Timestamp上调用apply,而是先把Timestamp转成字符串,直接用CommonRegex处理单个字符串,再根据提取结果返回对应值。配合np.where,我们只对mask=True的行应用这个函数,完美匹配你的需求。
示例运行结果
以你给出的示例DataFrame为例,运行上述代码后会得到类似如下的输出(X的长度是随机的):
| Name | Dates | mask |
|---|---|---|
| Tom | XXXXX | True |
| Nick | 2018-07-28 | False |
| Juli | XXX | True |
| June | XXXXXX | True |
| XHGM | 2018-08-07 | False |
内容的提问来源于stack exchange,提问作者Parth Tiwari
相关产品推荐
相关产品推荐

