簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM