df =
multi
0 MULTIPOLYGON(((3 11, 2 33)))
1 MULTIPOLYGON(((4 22, 5 66)))
我试图删除单词'MULTIPOLYGON'和括号“ ((((',')))'>
df['multi'] = df['multi'].str.replace(r"\(.*\)","")
df['multi'] = df['multi'].map(lambda x: x.lstrip('MULTIPOLYGON()').rstrip('aAbBcC'))
df.values =
array([[''],
[''],
...
[''],
[''],
[''],
['7.5857754821 44.9628409423']
df =
multi
3 11, 2 33
4 22, 5 6
答案 0 :(得分:1)
尝试一下:
import pandas as pd
import re
def f(x):
x = ' '.join(re.findall(r'[0-9, ]+',x))
return x
def f2(x):
x = re.findall(r'[0-9, ]+',x)
return pd.Series(x[0].split(','))
df =pd.DataFrame({'a':['MULTIPOLYGON(((3 11, 2 33)))' ,'MULTIPOLYGON(((4 22, 5 6)))']})
df['a'] = df['a'].apply(f)
print(df)
#or for different columns you can do
df =pd.DataFrame({'a':['MULTIPOLYGON(((3 11, 2 33)))' ,'MULTIPOLYGON(((4 22, 5 6)))']})
#df['multi'] = df.a.str.replace('[^0-9. ]', '', regex=True)
#print(df)
list_of_cols = ['c1','c2']
df[list_of_cols] = df['a'].apply(f2)
del df['a']
print(df)
输出:
a
0 3 11, 2 33
1 4 22, 5 6
c1 c2
0 3 11 2 33
1 4 22 5 6
[Finished in 2.5s]
答案 1 :(得分:1)
您还可以将str.replace
与正则表达式一起使用:
# removes anything that's not a digit or a space or a dot
df['multi'] = df.multi.str.replace('[^0-9\. ]', '', regex=True)#changing regex
答案 2 :(得分:1)
您可以通过以下方式使用df.column.str。
df['a'] = df['a'].str.findall(r'[0-9.]+')
df = pd.DataFrame(df['a'].tolist())
print(df)
输出:
0 1
0 3.49 11.10
1 4.49 22.12
这将适用于任意数量的列。但最后必须为这些列命名。
df.columns = ['a'+str(i) for i in range(df.shape[1])]
即使某些行具有不同数量的数值,此方法也将起作用。喜欢
df =pd.DataFrame({'a':['MULTIPOLYGON(((3.49)))' ,'MULTIPOLYGON(((4.49 22.12)))']})
a
0 MULTIPOLYGON(((3.49)))
1 MULTIPOLYGON(((4.49 22.12)))
所以预期的输出是
0 1
0 3.49 None
1 4.49 22.12
使用命名列后,
df.columns = ['a'+str(i) for i in range(df.shape[1])]
你得到
a0 a1
0 3.49 None
1 4.49 22.12
答案 3 :(得分:0)
Apply在pandas
中是一种相当慢的方法,因为它基本上是一个循环遍历每一行并应用您的函数的循环。熊猫有矢量化方法,我们可以在此处使用str.extract
提取图案:
df['multi'] = df['multi'].str.extract('(\d\.\d+\s\d+\.\d+)')
multi
0 3.49 11.10
1 4.49 22.12