熊猫:如果包含字符串,则更新列B值

2022-12-01 05:43:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望创建/更新一个新列,如果列中的文本 A包含一个字符串。它在没有forloop的情况下工作,但是当我尝试迭代时,它会设置默认值,而不是检测到的值

当然,我不应该手动添加同一行171次,我已经搜索了互联网等可能的提示和或解决方案,似乎找不到任何好的信息

工作代码:

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 = str(dept)来确保部门作为字符串输入,但没有效果

提前感谢您的帮助。我觉得这是一个简单的问题,应该很容易解决,但我遇到了一个障碍


Tags: 字符串文本dfnp情况手动whereunknown部门physcontainsstrdeptforloopdepts
3条回答

@U-12-Forward有一个很好的解决方案,如果只假设有一个新列的标题是字符串'dept',而不是循环中每个dept变量的值

如果目的是为depts中的每个dept创建一个新列,则删除列索引器中“dept”周围的引号:

for dept in depts:
    df[dept] = np.where(df.a.str.contains(dept), dept, "Unknown")

该示例令人困惑,因为由于变量名的原因,不清楚每个dept(即PHYS,PSYCH)是否应该有一个新列

这段摘录不会“起作用”,因为它会用“PSYCH”和“Unknown”(没有“PHYS”)的组合来覆盖第二个作业的df['dept']

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,因此返回完整的“未知”序列

我更喜欢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
>>> 

我们通常这样做

df['dept'] = df.a.str.findall('|'.join(depts)).str[0]