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