#python #pandas #split
#python #pandas #разделение
Вопрос:
У меня есть текстовый файл, с которым я работаю, и он разделен пробелами вместо запятых. Я выполнил несколько из них, всегда создавая одну длинную строку, а затем разбивая на столбцы, где это необходимо. Данные всегда выстраивались до сих пор, и я столкнулся с проблемой. Ниже у меня есть фрейм данных с некоторым примером текста.
Что я пытаюсь сделать:
- Начните с (0, тест) в серии. Работайте вниз.
- Проверьте элемент в (0, Test) на номер или букву в первой позиции (0) строки. Если число существует, пропустите или ничего не делайте. Если буква существует, код, необходимый для разделения при первом появлении пробела:
df[['First Name', 'Test']] = df['Test'].str.split(" ", 1, expand=True)
и удалите первое имя из столбца Test и поместите его в столбец First Name. - Перейдите к следующей строке вниз и повторяйте, пока не закончите с серией.
- (Бонус): за первым именем (строка 1) может следовать средний инициал. Если возможно, можно ли это также зафиксировать?
код
import pandas as pd
from pandas import DataFrame, Series
list = {'Test': ['9/21/2019 1 9/29/2019',
'Cynthia T. CC 9/21/2016 1 9/30/2019',
'9/12/2019 1 9/12/2012',
'Hannah A/R 9/20/2015 1 9/07/2016',
'John CC 9/26/2019 3 9/29/2019']}
df = pd.DataFrame(list)
# for n in df.Test:
# if n[0].isalpha:
# df[['First Name', 'Test']] = df['Test'].str.split(" ", 1,
expand=True)
# else:
# continue
print(df)
#----------------------------
# Currently:
# Test
# 0 9/21/2019 1 9/29/2019
# 1 Cynthia T. CC 9/21/2016 1 9/30/2019
# 2 9/12/2019 1 9/12/2012
# 3 Hannah A/R 9/20/2015 1 9/07/2016
# 4 John CC 9/26/2019 3 9/29/2019
# What I would like:
# Test First Name
# 0 9/21/2019 1 9/29/2019 NaN
# 1 CC 9/21/2016 1 9/30/2019 Cynthia T.
# 2 9/12/2019 1 9/12/2012 NaN
# 3 A/R 9/20/2015 1 9/07/2016 Hannah
# 4 CC 9/26/2019 3 9/29/2019 John
Как всегда, мы ценим ваше время и знания. Я благодарю вас за любую помощь.
Комментарии:
1. если вы предоставите (не усеченный) пример текста в вашем файле, мы можем помочь
2. кроме того, пожалуйста, сделайте вопрос более кратким :). Нам просто нужны входные данные и ожидаемый результат
3. Анон01, приведенный выше фрейм данных является примером, с которым я работаю. Кроме того, вставленный в нижней части восстановленного кода в настоящее время отображает то, что я хотел бы отобразить. Что касается вопроса. есть ли способ выполнить цикл вниз по ряду, если строка [0] является alpha, затем выполните .str.split(» «, 1, expand = True) и удалите первое имя и поместите его в новый столбец. Как в примере выше. Пожалуйста, дайте мне знать, если у вас возникнут дополнительные вопросы.
4. Трудно понять, чего вы хотите. Я посмотрю, можете ли вы сделать вопрос более кратким
5. Извините за путаницу. Я отредактирую.
Ответ №1:
Вы можете выполнить разделение (а также проверить наличие альфа-кода) с помощью инструментов доступа к строкам pandas.
# split and get the first name
df['First Name'] = df['Test'].str.split(n=1).str[0]
# filter out numerics
df['First Name'] = df['First Name'].where(df['First Name'].str.isalpha())
Вывод
Test First Name
0 9/21/2019 1 9/29/2019 NaN
1 Cynthia T. CC 9/21/2016 1 9/30/2019 Cynthia
2 9/12/2019 1 9/12/2012 NaN
3 Hannah A/R 9/20/2015 1 9/07/2016 Hannah
4 John CC 9/26/2019 3 9/29/2019 John
Комментарии:
1. Привет, Ричиев, спасибо, что изучили это. Одна вещь, не должен ли метод разделения удалять первое имя (в данном случае) из столбца [‘Test’]? Можно ли это включить в ваш код?
2. Это почти то, что мне нужно, единственный другой вопрос, который у меня может возникнуть, — это посмотреть на шаг 4. Некоторые строки содержат средний инициал с точкой. Пример выше, строка 1: Синтия Т. Можно ли обработать ваш код, чтобы перехватить строки этого типа?
3. Да, сохраняйте все в правой части вхождения. У меня есть длинная строка кода, которую я удаляю по одному вхождению за раз и помещаю в новый столбец…. Надеюсь, это имеет смысл.
4. Иметь
First name
бытьCynthia T.
и сохранятьTest
какCC 9/21/2016...
?5. ДА… это выглядит хорошо. У некоторых средних инициалов есть точка после начальной, а у некоторых нет. Если период остался позади, я могу сделать lstrip для периода, который нужно удалить, я думаю.