Удалить открывающую и закрывающую скобки со словом в пандах - PullRequest
0 голосов
/ 03 ноября 2019

С учетом фрейма данных:

df = 

                         multi
0 MULTIPOLYGON(((3 11, 2 33)))
1 MULTIPOLYGON(((4 22, 5 66)))

Я пытался удалить слово 'MULTIPOLYGON' и круглые скобки ' (((', '*)1008 *))) '


Моя попытка:

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

Ответы [ 4 ]

1 голос
/ 03 ноября 2019

Вы также можете использовать 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
1 голос
/ 03 ноября 2019

Вы можете использовать df.column.str следующим образом.

df['a'] = df['a'].str.findall(r'[0-9.]+')
df = pd.DataFrame(df['a'].tolist())
print(df)

output:

     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
1 голос
/ 03 ноября 2019

Попробуйте это:

    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]
0 голосов
/ 03 ноября 2019

Apply - довольно медленный метод в pandas, так как в основном это цикл, который перебирает каждую строку и применяет вашу функцию. У 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...