我想洗掉我的所有標志,dataframe以將其保留為以下兩種格式之一:100-200或200
因此,如果給出了一系列薪水,則薪水之間應該有一個連字符,否則應該是一個干凈的單個數字。
我有以下資料:
import pandas as pd
import re
df = {'salary':['£26,768 - £30,136/annum Attractive benefits package',
'£26,000 - £28,000/annum plus bonus',
'£21,000/annum',
'£26,768 - £30,136/annum Attractive benefits package',
'£33/hour',
'£18,500 - £20,500/annum Inc Bonus - Study Support Bens',
'£27,500 - £30,000/annum £27,500 to £30,000 Study',
'£35,000 - £40,000/annum',
'£24,000 - £27,000/annum Study Support (ACCA / CIMA)',
'£19,000 - £24,000/annum Study Support',
'£30,000 - £35,000/annum',
'£44,000 - £66,000/annum 15% Bonus Excellent Benefits. L',
'£75 - £90/day £75-£90 Per Day']}
data = pd.DataFrame(df)
以下是我嘗試洗掉的一些跡象:
salary = []
for i in data.salary:
space = re.sub(" ",'',i)
lower = re.sub("[a-z]",'',space)
upper = re.sub("[A-Z]",'',lower)
bracket = re.sub("/",'',upper)
comma = re.sub(",", '', bracket)
plus = re.sub("\ ",'',comma)
percentage = re.sub("\%",'', plus)
dot = re.sub("\.",'', percentage)
bracket1 = re.sub("\(",'',dot)
bracket2 = re.sub("\)",'',bracket1)
salary.append(bracket2)
這給了我:
'£26768-£30136',
'£26000-£28000',
'£21000',
'£26768-£30136',
'£33',
'£18500-£20500-',
'£27500-£30000£27500£30000',
'£35000-£40000',
'£24000-£27000',
'£19000-£24000',
'£30000-£35000',
'£44000-£6600015',
'£75-£90£75-£90'
但是,我有一些重復的數字,基本上我想要洗掉第一個值范圍之后的任何內容,以及兩個數字之間的連字符之外的任何符號。
預期輸出:
'26768-30136',
'26000-28000',
'21000',
'26768-30136',
'33',
'18500-20500',
'27500-30000',
'35000-40000',
'24000-27000',
'19000-24000',
'30000-35000',
'44000-66000',
'75-90
uj5u.com熱心網友回復:
使用pandas.Series.str.partitionwith 的另一種方式replace:
data["salary"].str.partition("/")[0].str.replace("[^\d-] ", "", regex=True)
輸出:
0 26768-30136
1 26000-28000
2 21000
3 26768-30136
4 33
5 18500-20500
6 27500-30000
7 35000-40000
8 24000-27000
9 19000-24000
10 30000-35000
11 44000-66000
12 75-90
Name: 0, dtype: object
解釋:
它假定您只對以下部分感興趣/;它會提取所有內容,直到/, 而不是洗掉除數字和 hypen 之外的任何內容
uj5u.com熱心網友回復:
您可以使用
data['salary'].str.split('/', n=1).str[0].replace('[^\d-] ','', regex=True)
# 0 26768-30136
# 1 26000-28000
# 2 21000
# 3 26768-30136
# 4 33
# 5 18500-20500
# 6 27500-30000
# 7 35000-40000
# 8 24000-27000
# 9 19000-24000
# 10 30000-35000
# 11 44000-66000
# 12 75-90
這里,
.str.split('/', n=1)- 用第一個/字符分成兩部分.str[0]- 獲得第一個專案.replace('[^\d-] ','', regex=True)- 洗掉除數字和連字符以外的所有字符。
更精確的解決方案是提取£num(-£num)?模式并洗掉所有非數字/連字符:
data['salary'].str.extract(r'£(\d (?:,\d )*(?:\.\d )?(?:\s*-\s*£\d (?:,\d )*(?:\.\d )?)?)')[0].str.replace(r'[^\d-] ', '', regex=True)
詳情:
£- 文字字符\d (?:,\d )*(?:\.\d )?- 一個或多個數字,后跟零個或多個逗號和一個或多個數字,然后是一個點和一個或多個數字的可選序列(?:\s*-\s*£\d (?:,\d )*(?:\.\d )?)?- 可選出現的用零個或多個空格 (\s*-\s*)括起來的連字符,然后是£char 和上述數字模式。
uj5u.com熱心網友回復:
您只需通過兩次正則運算式即可完成。首先使用正則運算式提取貨幣金額,然后洗掉千位分隔符,最后,按組加入輸出,每個原始行僅保留前兩次出現。
此解決方案的優點是實際上只提取貨幣數字,而不是如果輸入不干凈時可能存在的其他數字。
(data['salary'].str.extractall(r'£([,\d] )')[0] # extract £123,456 digits
.str.replace(r'\D', '', regex=True) # remove separator
.groupby(level=0).apply(lambda x: '-'.join(x[:2])) # join first two occurrences
)
輸出:
0 26768-30136
1 26000-28000
2 21000
3 26768-30136
4 33
5 18500-20500
6 27500-30000
7 35000-40000
8 24000-27000
9 19000-24000
10 30000-35000
11 44000-66000
12 75-90
uj5u.com熱心網友回復:
您可以使用替換模式和可選的捕獲組來匹配資料格式,并在替換中使用這些組。
import pandas as pd
df = {'salary':['£26,768 - £30,136/annum Attractive benefits package',
'£26,000 - £28,000/annum plus bonus',
'£21,000/annum',
'£26,768 - £30,136/annum Attractive benefits package',
'£33/hour',
'£18,500 - £20,500/annum Inc Bonus - Study Support Bens',
'£27,500 - £30,000/annum £27,500 to £30,000 Study',
'£35,000 - £40,000/annum',
'£24,000 - £27,000/annum Study Support (ACCA / CIMA)',
'£19,000 - £24,000/annum Study Support',
'£30,000 - £35,000/annum',
'£44,000 - £66,000/annum 15% Bonus Excellent Benefits. L',
'£75 - £90/day £75-£90 Per Day']}
data = pd.DataFrame(df).salary.replace(
r"^£(\d )(?:,(\d ))?(?:\s*(-)\s*£(\d )(?:,(\d ))?)?/.*",
r"\1\2\3\4\5", regex=True
)
print(data)
模式匹配
^字串的開始£從字面上匹配(\d )在第 1 組中捕獲 1 個數字(?:,(\d ))?可選地捕獲第 2 組中的1 位,前面有逗號以匹配資料格式(?:非捕獲組作為一個整體匹配\s*(-)\s*£-在第 3 組中的可選空白字符之間捕獲并匹配 £(\d )(?:,(\d ))?和之前一樣,現在在第 4組和第 5 組
)?關閉非捕獲組并使其可選
查看正則運算式演示。
輸出
0 26768-30136
1 26000-28000
2 21000
3 26768-30136
4 33
5 18500-20500
6 27500-30000
7 35000-40000
8 24000-27000
9 19000-24000
10 30000-35000
11 44000-66000
12 75-90
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/409084.html
標籤:
下一篇:Pandas替換列的NaN值
