[英]Pandas: Updating Column B value if A contains string
如果 A 列中的文本包含字符串,我希望創建/更新一個新列,“dept”。 它在不涉及 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 = 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
(即 PHYS、PSYCH)創建一個新列。
這個摘錄不會“工作”,因為它會在第二個任務中覆蓋df['dept']
,而它只是'PSYCH'和'Unknown'的組合(不會有'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
,因此返回完整的“未知”系列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.