我有这样的数据集:
import pandas as pd
import numpy as np
x = np.array([
'355395.7037',
'355369.6383',
'355367.881',
'355381.419',
'357394.9D7a82te7o6fm4o9n4t3h7 print: 06/10/202',
'357405.7897626596'])
y = np.array([
'4521429.292',
'4521430.0229',
' 4521430.1191',
'4521430.1256',
'3 13:36 4521735.552137422',
'4521512.725'])
df = pd.DataFrame({'X':x, 'Y':y})
所以,有时,我可能会将字符串与数字混合在一起。
我想到的一个解决方案。
例如,如果您注意到
357394.9D7a82te7o5fm4o9n4t3h7 print: 06/10/202
,则数字Date of month
内有文字357394.97827649437
。
并且在
y
列:'3 13:36 4521735.552137422'
有来自上一个3
的2023
的print: 06/10/202
和时间13:36
。
我想摆脱它们,只留下数字。
我可能有不同的情况,例如:
'357394.9D7a82te7o6fm4o9n4t3h7 print: 06/10/2023'
例如13:36 4521735.552137422
。
或者,
'357394.9 D7a82te7o6fm4o9n4t3h7 print: ',
'06/10/2023 13:36 4521735.552137422'
如果您看到数字,例如对于
X
列,所有数字的小数点前都有 6
位,因此我们可以以 的前 6 位数字为例
'357394.9D7a82te7o6fm4o9n4t3h7 print: 06/10/202',
-> 357394 并应用小数点并填充其余数字,直到存在空格或单词(打印)。所以,要取的数字是357394.97827649437
但问题是我们有一个字符串,我们无法应用例如
float
或 int
来处理它。
对于第二种情况,对于
Y
列:
'3 13:36 4521735.552137422',
我认为我们必须从末尾开始搜索,当我们看到小数点时,数
7
位数(Y列有小数点前7位)并停在那里。
最好的办法是首先尝试避免这种格式,特别是当数字与您的值混合时。
replace
删除字母,然后使用正则表达式来 str.extract
数字:
out = df.apply(lambda s: s.str.replace('[^\d .]+', '', regex=True)
.str.extract(r'(\d{6,}(?:\.\d+)?)', expand=False))
对于指定每列位数的动态解决方案:
d = {'X': 6, 'Y': 7}
out = df.apply(lambda s: s.str.replace('[^\d .]+', '', regex=True)
.str.extract(fr'(\d{{{d[s.name]},}}(?:\.\d+)?)',
expand=False)
)
输出:
X Y
0 355395.7037 4521429.292
1 355369.6383 4521430.0229
2 355367.881 4521430.1191
3 355381.419 4521430.1256
4 357394.97827649437 4521735.552137422
5 357405.7897626596 4521512.725