Извлечение значения из столбца в новые столбцы

#python #pandas #dataframe #data-extraction

#питон #панды #фрейм данных #извлечение данных

Вопрос:

Я хочу извлечь внутри столбца несколько столбцов. Вот исходные данные после импорта в dataframe.

 data = {'ID':  ['A0001', 'A0002', 'A0003', 'A0004', 'A0005'],
        'Name': ['John', 'Micheal', 'Angle', 'Jim', 'Rome'],
        'Details': ['Type:nHousenVector:nTrianglennMission:nCompleted,lv5nnNote user:n#', 'Type:n#nVector:nnnMission:nFailednNote user:n#', 'Type:nCarnVector:nSquarenMission:nCompletednNote user:n', 'Type:n#nVector:n#nMission:nCompleted without awardnnNote user:nNo end', 'Type:n#nVector:n#nMission:nnnNote user:nThere are many mistake.nI cant choose.nI cant buy.']
        }

df = pd.DataFrame (data, columns=['ID', 'Name', 'Details'])
df

ID      Name    Details
A0001   John    Type:nHousenVector:nTrianglennMission:nCompleted,lv5nnNote user:n#
A0002   Micheal Type:n#nVector:nnnMission:nFailednNote user:n#
A0003   Angle   Type:nCarnVector:nSquarenMission:nCompletednNote user:n
A0004   Jim     Type:n#nVector:n#nMission:nCompleted without awardnnNote user:nNo end
A0005   Rome    Type:n#nVector:n#nMission:nnnNote user:nThere are many mistake.nI cant choose.nI cant buy.
 

Я хочу извлечь значение в столбце Сведений. Но я не знаю, как это сделать.

Мои ожидаемые данные выглядят следующим образом

 data = {'ID':  ['A0001', 'A0002', 'A0003', 'A0004', 'A0005'],
        'Name': ['John', 'Micheal', 'Angle', 'Jim', 'Rome'],
        'Type': ['House', '#', 'Car', '#', '#'],
        'Vector': ['Triangle', '', 'Square', '#', '#'],
        'Mission': ['Completed,lv5', 'Failed', 'Completed', 'Completed without award', ''],
        'Note user': ['#', '#', '', 'No end', 'There are many mistake.I cant choose.I cant buy.']
        }

df = pd.DataFrame (data, columns=['ID', 'Name', 'Type', 'Vector', 'Mission', 'Note user'])
df



ID      Name    Type    Vector      Mission                      Note
A0001   John    House   Triangle    Completed,lv5                #
A0002   Micheal #                   Failed                       #
A0003   Angle   Car     Square      Completed   
A0004   Jim     #       #           Completed without award      No end
A0005   Rome    #       #                                        There are many mistake.I cant choose.I cant buy.
 

Комментарии:

1. похоже, вы хотите разделить столбец на n и сохранить все значения в разных столбцах

2. аналогично, но есть некоторое значение n n n заголовок — это слово с двоеточием (например, Тип: Вектор: Миссия: Примечание:) тоже.

Ответ №1:

Вот что я попробовал: первое значение в Details :

 'Type:nHousenVector:nTrianglennMission:nCompleted,lv5nnNote user:n#'
 

Я написал эту функцию , чтобы извлечь детали в a dict . Я жестко запрограммировал индексы массива, но вы можете не делать этого, если хотите:

 def extract_details(text):
    array = text.replace("nn", "n").split("n")
    return {
        array[0].replace(":", ""): array[1],
        array[2].replace(":", ""): array[3],
        array[4].replace(":", ""): array[5],
        array[6].replace(":", ""): array[7]
    }
 

Примените функцию ко всему столбцу:

 df['Details'].apply(extract_details)
 

Объедините этот новый столбец с исходным столбцом:

 pd.concat([
    df,
    pd.DataFrame(df['Details'].apply(extract_details).apply(pd.Series))
], axis=1)
 

Ответ №2:

Вы можете использовать регулярное выражение для получения ответов. Ссылка на документацию прилагается.

Сначала я заменяю все n на '' . Таким образом, все символы новой строки удаляются из Details столбца.

Затем я беру весь текст между двумя ключевыми словами. Для типа данные находятся между 'Type:' и 'Vector:' . Аналогично для вектора и миссии. Для заметки я собираю все данные после 'Note user:' . Теперь, когда вы извлекли данные из Details столбца, вы можете удалить столбец.

 import pandas as pd
data = {'ID':  ['A0001', 'A0002', 'A0003', 'A0004', 'A0005'],
        'Name': ['John', 'Micheal', 'Angle', 'Jim', 'Rome'],
        'Details': ['Type:nHousenVector:nTrianglennMission:nCompleted,lv5nnNote user:n#', 'Type:n#nVector:nnnMission:nFailednNote user:n#', 'Type:nCarnVector:nSquarenMission:nCompletednNote user:n', 'Type:n#nVector:n#nMission:nCompleted without awardnnNote user:nNo end', 'Type:n#nVector:n#nMission:nnnNote user:nThere are many mistake.nI cant choose.nI cant buy.']
        }

df = pd.DataFrame (data, columns=['ID', 'Name', 'Details'])

df['Details'] = df.Details.str.replace('n','', regex=True)
df['Type']    = df.Details.str.extract('Type:(.*)Vector')
df['Vector']  = df.Details.str.extract('Vector:(.*)Mission')
df['Mission'] = df.Details.str.extract('Mission:(.*)Note')
df['Note']    = df.Details.str.extract('Note user:(.*)')

print (df[['ID','Name','Type','Vector']])
print (df[['Mission','Note']])
 

Результатом этого будет:

       ID     Name   Type    Vector
0  A0001     John  House  Triangle
1  A0002  Micheal      #          
2  A0003    Angle    Car    Square
3  A0004      Jim      #         #
4  A0005     Rome      #         #

                   Mission                                              Note
0            Completed,lv5                                                 #
1                   Failed                                                 #
2                Completed                                                  
3  Completed without award                                            No end
4                           There are many mistake.I cant choose.I cant buy.