从混合字符串与数字中剥离字符串和adte、时间

问题描述 投票:0回答:1

我有这样的数据集:

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位)并停在那里。

python arrays pandas data-cleaning
1个回答
0
投票

最好的办法是首先尝试避免这种格式,特别是当数字与您的值混合时。

也就是说,您可以尝试使用

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
© www.soinside.com 2019 - 2024. All rights reserved.