如何将DataFrame分为FirstName列和LastName列

时间:2018-07-24 05:44:31

标签: python excel pandas

所以我正在Python 3.6中浏览带有熊猫的数据集。我正在使用Spyder IDE,并且excel工作表包含以下列:

[basic info][1]

这正在读取excel(xls)文件。真正有问题的列是“客户名称”列。为此,我想将“客户名称”列分为两个单独的列:“姓氏”和“姓氏”。但是,当我尝试这样做时:

df["FirstName"] = df[df["Customer Name"].apply(lambda x: x.split(" ")[0])]

我得到这个错误:

KeyError: "['Claire' 'Claire' 'Darrin' ..., 'Dave' 'Dave' 'Chris'] not in index"

但是,当我这样做时:

snames = df[df["Customer Name"].apply(lambda x: x.startswith("S"))]

它返回所有以S开头的客户名称。

我尝试用下划线替换所有空格,但是仍然出现相同的错误。我还浏览了excel中的数据,似乎没有丢失任何空格,或者我注意到了。

所以我想知道如何将这两部分拆分为单独的列?我不太担心连字号或其他奇怪的问题(但是,如果您愿意,可以自由地提供帮助)。

任何提示或建议都值得赞赏!

3 个答案:

答案 0 :(得分:0)

我认为需要split并分配给新列,如果始终是一个姓氏和一个姓氏:

df[["FirstName", "LastName"]] = df["Customer Name"].str.split(expand=True)

如果多个witespaces获得3列或更多列,则将更通用的解决方案分配给新的DataFrame-但是接下来的问题是区分哪个2名字在前或哪个2在后:

df1 = df["Customer Name"].str.split(expand=True)
#set columns names
#df1 = ["FirstName","LastName","Name"]

可能会出现错误,因为:

df["Customer Name"].apply(lambda x: x.split(" ")[0])

返回FirstName而不是布尔值,因此无法通过boolean indexing进行过滤。

答案 1 :(得分:0)

您可以尝试以下方法:

df['FirstName'] = df['Customer Name'].str.split().str[0]

答案 2 :(得分:0)

如果以姓氏、名字格式命名 FullName 列:

获取姓氏:

df["LastName"] = df["FullName"].apply(lambda x: x[0:x.find(",")])

(以上取字符串开头到逗号的所有内容,不包括逗号)

获取名字:

df["FirstName"] = df["FullName"].apply(lambda x: x[x.find(",")+2:])

(以上取字符串中逗号后2个字符(包括逗号)直到字符串结尾的所有内容)