假设我有一个包含四列的数据框架:a, B, C, d。这些列包含字符串数据,也可以是空的。我需要将这些值中的每一个更改为一个类别:Yes、No或Unknown,这取决于每个字符串中是否存在某些子字符串。每次比较仅基于每个单元格的值(其他列的内容无关紧要)。
我有一个函数str2cat
,它处理逻辑并假设它接收的参数(s
)是字符串或None
。为了一个MWE:
def str2cat(s):
if not s or s is None or s.strip() == '':
return "Some Category"
if "some string" in s.str.lower():
return "Another Category"
return "Default Category"
我目前在每个列中应用我想要的值,像这样:
df["A"] = df["A"].astype(str)
df["B"] = df["B"].astype(str)
df["C"] = df["C"].astype(str)
df["D"] = df["D"].astype(str)
df["A"] = df["A"].apply(str2cat)
df["B"] = df["B"].apply(str2cat)
df["C"] = df["C"].apply(str2cat)
df["D"] = df["D"].apply(str2cat)
这一切都很好,工作也很好。但它假设只有4列。假设我有不想应用此函数的其他列,并且我希望使用此函数针对许多列。我的想法是,我可以列出目标列,然后只将我的函数apply
到这些列:
targeted_cols = ["A", "B", "C", "D"]
df[targeted_cols] = df[targeted_cols].astype(str)
df[targeted_cols] = df[targeted_cols].apply(str2cat)
但这不起作用。我得到关于The truth value of a Series is ambiguous
的错误。我试着在我的apply
函数中添加axis=1
,但无济于事。我试着让我的函数处理多个参数,并有类似的错误。我想也许lambda函数可以解包该系列并每次向函数提供一个值,但没有运气。
一定有更好的方法来做这件事。
在不查看数据的情况下很难说这是否有效,但如果您只是希望将函数应用于所有列,则下面的循环应该可以满足您的需求:
for col in df.columns:
df[col] = df[col].astype(str).apply(str2cat)