Python, разделение нескольких строк в столбце - PullRequest
1 голос
/ 09 марта 2019

Добрый день, я пытаюсь разбить текст в столбце на специальный формат. Вот моя таблица ниже

UserId  Application
1       Grey Blue::Black Orange;White:Green
2       Yellow Purple::Orange Grey;Blue Pink::Red

Я хотел бы прочитать следующее:

UserId  Application
    1       Grey Blue
    1       White Orange
    2       Yellow Purple
    2       Blue Pink

По сути, я хотел бы сохранить первую строку каждого :: экземпляра для каждой строки в данной ячейке.

Пока мой код

def unnesting(df, explode):
    idx=df.index.repeat(df[explode[0]].str.len())
    df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
    df1.index=idx
    return df1.join(df.drop(explode,1),how='left')

df['Application']=df.Role.str.split(';|::|').map(lambda x : x[0::2])

unnesting(df.drop('Role',1),['Application']

Следующий код читает

UserId  Application
        1       Grey Blue, White Orange
        2       Yellow Purple, Blue Pink

Пожалуйста, помогите, я не знаю, где я должен использовать панд или numpy, чтобы решить эту проблему!!

1 Ответ

2 голосов
/ 09 марта 2019

Может быть, вы можете попробовать extractall

yourdf=df.set_index('UserId').Application.str.extractall(r'(\w+):').reset_index(level=0) 
# You can adding rename(columns={0:'Application'})at the end
Out[87]: 
       UserId       0
match                
0           1    Grey
1           1   White
0           2  Yellow
1           2    Blue

Обновление посмотреть на unnesting , после того как мы split и выберите нужное нам значение из строки, мы сохраняем их в list, когда у вас есть list тип в вас columns, я рекомендую использовать unnesting

df['LIST']=df.Application.str.split(';|::|:').map(lambda x : x[0::2])

unnesting(df.drop('Application',1),['LIST'])
Out[111]: 
            LIST  UserId
0      Grey Blue       1
0          White       1
1  Yellow Purple       2
1      Blue Pink       2

Моя собственная функция определения

def unnesting(df, explode):
    idx=df.index.repeat(df[explode[0]].str.len())
    df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
    df1.index=idx
    return df1.join(df.drop(explode,1),how='left')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...