разделение pandas на основе sep =’ ‘ не работает

#python #pandas #split

#python #pandas #разделение

Вопрос:

У меня есть текстовый файл, с которым я работаю, и он разделен пробелами вместо запятых. Я выполнил несколько из них, всегда создавая одну длинную строку, а затем разбивая на столбцы, где это необходимо. Данные всегда выстраивались до сих пор, и я столкнулся с проблемой. Ниже у меня есть фрейм данных с некоторым примером текста.

Что я пытаюсь сделать:

  1. Начните с (0, тест) в серии. Работайте вниз.
  2. Проверьте элемент в (0, Test) на номер или букву в первой позиции (0) строки. Если число существует, пропустите или ничего не делайте. Если буква существует, код, необходимый для разделения при первом появлении пробела: df[['First Name', 'Test']] = df['Test'].str.split(" ", 1, expand=True) и удалите первое имя из столбца Test и поместите его в столбец First Name.
  3. Перейдите к следующей строке вниз и повторяйте, пока не закончите с серией.
  4. (Бонус): за первым именем (строка 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 для периода, который нужно удалить, я думаю.