我有一個資料框:
{'country': {0: 'Afghanistan?*', 1: 'Albania?*'},
'region': {0: 'Asia', 1: 'Europe'},
'subregion': {0: 'Southern Asia', 1: 'Southern Europe'},
'rate_per_1000': {0: 6.7, 1: 2.1},
'count': {0: '2,474', 1: '61'},
'year': {0: 2018, 1: 2020},
'source': {0: 'NSO', 1: 'NSO'}}
country region subregion rate_per_1000 count year source
0 Afghanistan?* Asia Southern Asia 6.7 2,474 2018 NSO
1 Albania?* Europe Southern Europe 2.1 61 2020 NSO
這里有多個我想擺脫的壞角色。我為 .apply() 制作了一個簡短的函式來擺脫它們,但是我正在回圈遍歷已定義的壞字串列。這給我帶來了不好的代碼味道,我認為這個操作可以在某種程度上更加矢量化。這是我嘗試過的:
bad_chars = ['?', '*', ',']
def string_cleaner(col):
if col.dtype == 'object':
for char in bad_chars:
col = col.str.replace(f'{char}', '')
return col
homicide_by_country = homicide_by_country.apply(string_cleaner)
homicide_by_country
country region subregion rate_per_1000 count year source
0 Afghanistan Asia Southern Asia None 2474 None NSO
1 Albania Europe Southern Europe None 61 None NSO
我想要的結果是一種更 Pythonic/pandonic 的技術來實作相同的結果。
編輯:由于某種原因,您可能會注意到我的 rate_per_1000 列變為空白。我還沒有解決這個問題,但如果你發現一些明顯的東西,我會全神貫注。
uj5u.com熱心網友回復:
好像你df.replace
需要regex=True
import re
>>> df.replace('|'.join(map(re.escape, bad_chars)),'', regex=True)
請注意,這將保持列的相同 dtypes,因此無需擔心數字列。
另外,請注意,您需要對正則運算式進行特殊處理,因為?
, *
etc 是正則運算式中的特殊字符,因此您需要轉義這些字符。
更詳細一點,只要是特殊字符,re.escape
基本上都會\
在每個字符前面加一個。bad_chars
這是必要的,以確保特殊字符按字面意思表示。
以Python 檔案中的這個例子為例:
The first metacharacter for repeating things that we’ll look at is *.
* doesn’t match the literal character '*';
instead, it specifies that the previous character can be
matched zero or more times, instead of exactly once.
這意味著如果您只使用df.replace("*", "", regex=True)
,引擎將解釋*
為元字符,而不是星號,這會產生奇怪的結果。但是,如果您這樣做df.replace("\*", "", regex=True)
,*
則將被解釋為星號。“轉義”表示添加 a\
以指示您的意思是文字字符的此操作。
現在,|
也是一個元字符,意思是“加入”,或者"or"
. 在這里,我們不想逃避管道,因為我們希望用它的正則運算式功能來解釋它。
下面的運算式
'|'.join(map(re.escape, bad_chars))
會產生類似的東西
\?|\*|,
這意味著我們想用空字串替換所有的\?
and 。\*
,
uj5u.com熱心網友回復:
您可以使用select_dtypes
來定位您的替換,然后update
:
import re
bad_chars = ['?', '*', ',']
reg = f'[{"".join(map(re.escape, bad_chars))}]'
df.update(df
.select_dtypes(object)
.apply(lambda c: c.str.replace(reg, '', regex=True))
)
print(df)
注意。修改到位
輸出:
country region subregion rate_per_1000 count year source
0 Afghanistan Asia Southern Asia 6.7 2474 2018 NSO
1 Albania Europe Southern Europe 2.1 61 2020 NSO
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488824.html