Расщепление числа и слова панды с сохранением индекса - PullRequest
1 голос
/ 04 ноября 2019

У меня есть столбец моего фрейма данных df, как col1. Из col1 мне нужно создать два столбца числа и слова. df ['col1'] разделить на df ['code'], df ['name'].

(index)                                  col1

94                                      520XX
111                                     316aa
114                                     Entry
144                                 325 Sport
146                                 xColor35d
166                               420 M Sport
167                                        XX
199                                        XX
225                                    645 Ai

Я пытался таким образом

import pandas as pd
import numpy as np

result = df['col1'].str.split('(\d+)([A-Za- z]+)', expand=True)
result = result.loc[:,[0,1,2,3]]
result.rename(columns={0:'split_0',1:'split_1', 2:'split_2',3:'split_3'}, inplace=True)
result['split_0'] = result['split_0'].fillna(value=pd.np.NaN, inplace=False)
result['split_0'] = result['split_0'].astype(str).replace(r'^\s*$', np.nan, regex=True)
result

Результат равен

    split_0       split_1   split_2  split_3  

94  520            XX       None    None    
111 NaN            316      aa  
114 Entry          None     None    None
144 325 Sport      None     None    None
146 xColor         35       d   
166 420 M Sport    None     None    None
167 XX             None     None    None
199 XX             None     None    None
225 645 Ci         None     None    

Моя проблема возникает, когда я пытаюсь разбить столбец столбца split_0 на числои слова, а затем объединяются и имеют в конце только два столбца, содержащие числа и слова из всех столбцов split_ *, сохраняя индекс как:

    code           name

94  520            XX           
111 316            aa           
114 NaN            Entry    
144 325            Sport    
146 35             xColor d 
166 420            M Sport  
167 NaN            XX       
199 NaN            XX       
225 645            Ci           

1 Ответ

4 голосов
/ 04 ноября 2019

Попробуйте str.extractall и pd.concat

code = (df.col1.str.extractall('(\d+)')[0]+ ' ') \
                   .sum(level=0).str.strip().rename('code')
name = (df.col1.str.extractall('([a-zA-Z]+)')[0]+ ' ') \
                   .sum(level=0).str.strip().rename('name')

df_out = pd.concat([code, name], axis=1)


Out[139]:
    code      name
94   520        XX
111  316        aa
114  NaN     Entry
144  325     Sport
146   35  xColor d
166  420   M Sport
167  NaN        XX
199  NaN        XX
225  645        Ai
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...