如果 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 作為字串輸入。
在此先感謝您的任何幫助。我覺得這是一個應該很容易解決的簡單問題,但我遇到了障礙。
uj5u.com熱心網友回復:
我們通常做
df['dept'] = df.a.str.findall('|'.join(depts)).str[0]
uj5u.com熱心網友回復:
我更喜歡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
>>>
uj5u.com熱心網友回復:
@U-12-Forward 有一個很好的解決方案,如果只應該有一個專門用字串 'dept' 命名的新列,而不是dept回圈中每個變數的值。
如果目的是為每個deptin創建一個新列depts,則洗掉列索引器中“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將是 all False,因此回傳完整的“未知”系列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325907.html
下一篇:原始錯誤是:dlopen(/Users/ulto4/miniforge3/envs/python386/lib/python3.8/site-packages/numpy/core/_multiarr
