Добавление вновь созданных переменных в существующий фрейм данных в 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