我希望创建/更新一个新列,'dept'如果列中的文本A包含一个字符串。它可以在没有forloop的情况下工作,但是当我尝试迭代时,它会设置默认值而不是检测到的值。
当然我不应该手动添加相同的行171次,我已经搜索了互联网和SO可能的提示和/或解决方案,似乎找不到任何好的信息。
工作代码:
df['dept'] = np.where(df.a.str.contains("PHYS"), "PHYS", "Unknown")
但当我尝试:
depts = ['PHYS', 'PSYCH']
for dept in depts:
df['dept'] = np.where(df.a.str.contains(dept), dept, "Unknown")
print(dept)
我得到了所有的"未知"但是正确地打印出每个dept。我还试图通过显式地声明dept = str(dept)
来确保dept作为字符串输入,但无济于事。
提前感谢所有的帮助。我觉得这是一个简单的问题,应该很容易排序,但我正在经历一个块。
我们通常这样做
df['dept'] = df.a.str.findall('|'.join(depts)).str[0]
我更喜欢str.extract
:
df['depth'] = df['a'].str.extract(f"({'|'.join(depts)})").fillna("Unknown")
或:
df['depth'] = df['a'].str.extract('(' + '|'.join(depts) + ')').fillna("Unknown")
两个代码输出:
>>> df
a depth
0 ewfefPHYS PHYS
1 QWQiPSYCH PSYCH
2 fwfew Unknown
>>>
@U-12-Forward有一个很好的解决方案,如果只应该有一个新的列,专门与字符串'dept',而不是每个dept
变量在循环中的值。
如果目的是为depts
中的每个dept
创建一个新列,那么删除"dept"在列索引器中:
for dept in depts:
df[dept] = np.where(df.a.str.contains(dept), dept, "Unknown")
这个例子是令人困惑的,因为它不清楚是否应该有一个新的列为每个dept
(即,物理,心理),因为变量名。
这段节选将无法"工作"。因为它会在第二次赋值时用'PSYCH'和'Unknown'的组合覆盖df['dept']
(不会有'PHYS')。
df['dept'] = np.where(df.a.str.contains("PHYS"), "PHYS", "Unknown")
df['dept'] = np.where(df.a.str.contains("PSYCH"), "PSYCH", "Unknown")
如果列a
中没有包含depts
中最后一个元素的字符串,那么您所描述的情况肯定会发生,因为最后一个np.where
的结果将全部为False
,因此返回完整的'未知'系列。