Добавление вновь созданных переменных в существующий фрейм данных в Python Pandas

Я хотел бы создать функцию SplitName(), которая 1) преобразует все буквы в нижний регистр, 2) разделяет запись имени по пробелам (т. Е. "Джон Сноу" на "Джон" и "Сноу") и 3) создает данные кадр в Pandas, который принимает разделенные имена и создает новые столбцы (один как "имя", а другой как "фамилия").

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

def SplitName():
    data = pd.read_csv("C:\data.csv")
    frame2 = DataFrame(data)
    frame2.columns = ["Name", "Ethnicity", "Event_Place", "Birth_Place"]
    name_lower = frame2["Name"].str.lower() # make names lower case
    name_split = name_lower.str.split() # split string element by space
    name_split_smallList = name_split[0:10] # small set to easily handle
    #print name_split_smallList
    '''for lastName in name_split_smallList:
        print lastName[0] + " " + lastName[-1]'''

    name_lower_list = name_lower.tolist()
    frame_all = frame2 + name_lower_list
    print frame_all[0:10]

1 ответ

Решение

Чтобы создать новые столбцы во фрейме данных, вы можете просто назначить ряд точно так же, как вы присвоите некоторым данным имя переменной: со знаком равенства.

Далее предполагается, что файл CSV имеет заголовок с именем "Имя", и что Имя никогда не может быть разделено более одного раза, то есть отсутствуют вторые имена. Функция просто создала фрейм данных, прочитав файл csv, а затем создала два ряда объектов с опущенными строками. Ряд first_name принимает опущенную строку в позиции индекса 0 для всех значений разбиения имени, кроме пробелов, а в серии 'second_name' - пониженную строку в позиции индекса 1 для всех значений разделения имени пробелами. Объекты Series создаются с использованием понимания списка... Следовательно, предполагается, что не существует Имен с более чем двумя компонентами, т.е. никаких отчеств. Это может быть то, что вы хотите проверить в первую очередь.

def SplitName():
    DF = pd.read_csv("C:\data.csv") #this already created a DataFrame.
    DF['first_name'] = pd.Series([Name.lower().split()[0] for Name in DF['Name'], index = DF.index)
    DF['second_name'] = pd.Series([Name.lower().split()[1] for Name in DF['Name'], index = DF.index)
    return DF
Другие вопросы по тегам