Pandas:更新列B的值,如果A包含字符串



我希望创建/更新一个新列,'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,因此返回完整的'未知'系列。

相关内容

  • 没有找到相关文章

最新更新