英文:
Pandas: Lambda Function using a conditional as well as an operator (Or, and))
问题
我正在学习关于Lambda函数在pandas中的应用,我尝试根据是否在列(A)中出现特定单词来创建一个新列("Appeals","Audit","Assessment"),但是我收到了以下错误:
AttributeError: 'str'对象没有属性'str'
d = {"A": ["Assessment Division", "Division of Appeals", "Calgary Audit", "Halifax Market", "Georgian Markers"],
"B": [100, 300, 400, 500, 400]}
sample = pd.DataFrame(d)
sample["results"] = sample["A"].apply(lambda x: "Invoice" if "Audit" in x or "Appeals" in x or "Assessment" in x else "NoAction")
我也尝试了下面的代码来缩短我的代码,但是收到相同的错误:
d = {"A": ["Assessment Division", "Division of Appeals", "Calgary Audit", "Halifax Market", "Georgian Markers"],
"B": [100, 300, 400, 500, 400]}
sample = pd.DataFrame(d)
reqs = ["Audit", "Appeals", "Assessment"]
sample["results"] = sample["A"].apply(lambda x: "Invoice" if any(req in x for req in reqs) else "NoAction")
英文:
I am working through my comprehension of lambdas functions as it pertains to pandas.
I am trying to create a new column based on if a certain word appears in column (A) ("Appeals","Audit","Assessment")
However I am receiving an error of:
AttributeError: 'str' object has no attribute 'str'
d = {"A":["Assessment Division","Division of Appeals","Calgary Audit","Halifax Market","Georgian Markers"],
"B":[100,300,400,500,400]
sample = pd.DataFrame(d)
sample["results"] = sample["A"].apply(lambda x: "Invoice" if x.str.contains("Audit") or x.str.contains("Appeals") or x.str.contains("Assessment") else "NoAction")
I have also tried this to attempt to shorten my code but receive the same error:
d = {"A":["Assessment Division","Division of Appeals","Calgary Audit","Halifax Market","Georgian Markers"],
"B":[100,300,400,500,400]
sample = pd.DataFrame(d)
reqs = ["Audit","Appeals","Assessment"]
sample["results"] = sample["A"].apply(lambda x: "Invoice" if x.str.contains().isin(reqs) else "NoAction")
答案1
得分: 2
你可以使用 any()
来检查字符串是否包含reqs
中的任何单词:
reqs = ["Audit","Appeals","Assessment"]
mask = sample['A'].apply(lambda x: any(r in x for r in reqs))
sample['results'] = np.where(mask, 'Invoice', 'NoAction')
print(sample)
打印结果:
A B results
0 Assessment Division 100 Invoice
1 Division of Appeals 300 Invoice
2 Calgary Audit 400 Invoice
3 Halifax Market 500 NoAction
4 Georgian Markers 400 NoAction
编辑:一行代码实现:
sample['results'] = sample['A'].apply(lambda x: 'Invoice' if any(r in x for r in reqs) else 'NoAction')
英文:
You can use any()
to check if the string contains any word from your reqs
:
reqs = ["Audit","Appeals","Assessment"]
mask = sample['A'].apply(lambda x: any(r in x for r in reqs))
sample['results'] = np.where(mask, 'Invoice', 'NoAction')
print(sample)
Prints:
A B results
0 Assessment Division 100 Invoice
1 Division of Appeals 300 Invoice
2 Calgary Audit 400 Invoice
3 Halifax Market 500 NoAction
4 Georgian Markers 400 NoAction
EDIT: One-liner:
sample['results'] = sample['A'].apply(lambda x: 'Invoice' if any(r in x for r in reqs) else 'NoAction')
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论