#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.