簡體   English   中英

將字符串從一列替換為另一列

[英]Replace a string form one column in another column

是否可以僅使用pandas.Series.str方法將一列中的字符串替換為 pandas dataframe 中另一列中的相應字符串? “否”是一個可以接受的答案,只要它附有 pandas 版本和文檔的相關部分。

這是一個例子:

import pandas as pd
# version >= 0.19.2
df = pd.DataFrame(
    {
        'names': ['alice', 'bob', 'catherine', 'slagathor'],
        'hobbies': [
            'alice likes to knit',
            'bob likes to bowl',
            'plays with her cats',
            'slagathor burniates peasants for fun'
        ]
    }
)

def clean(df: pd.DataFrame) -> pd.Dataframe: ... # do the substitutions

assert all(
    clean(df).hobbies == pd.Series([
        'likes to knit',
        'likes to bowl',
        'plays with her cats',
        'burniates peasants for fun'
    ])
)

在這種情況下,我想從hobbies列中省略name列中的字符串,使用類似

df.hobbies.str.replace('(' + df.names + r'\s*)?', '')  # doesn't work

到目前為止,我不得不

import re
df['replaced'] = pd.Series(
    re.sub(f'^{df.names[i]} ?', '', df.hobbies[i]) for i in df.index
)  

如將一列中的值替換為另一列的答案 Pandas DataFrame

str.replace是一個Series方法,因此它可以應用於特定列的每個元素,但是不可能引用任何其他列。

因此,您必須在應用於每的函數中導入re並使用re.sub代替(這樣該函數才能引用當前行的其他列)。

您的任務可以在一條指令中執行:

df['replaced'] = df.apply(lambda row: re.sub(
    '^' + row.names + r'\s*', '', row.hobbies), axis=1)

該解決方案的運行速度比在內部創建for循環並隨后在列下替換的Series更快,因為apply負責遍歷DataFrame的循環,因此所應用的函數僅負責生成要放入當前行的值。

與執行速度有關的一個重要因素還在於,您避免在循環中每次都按索引定位當前行。

同樣,如果索引不是從0開始的連續數字,則代碼將失敗。嘗試例如使用index=np.arange(1, 5)參數創建DataFrame。

apply with replace 將在這里完成工作

df.apply(lambda x: x['hobbies'].replace(x['names'],''),axis=1)

它獲取數據框的每一行並將'hobbies'中的'names'替換為空字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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