所以我正在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中的数据,似乎没有丢失任何空格,或者我注意到了。
所以我想知道如何将这两部分拆分为单独的列?我不太担心连字号或其他奇怪的问题(但是,如果您愿意,可以自由地提供帮助)。
任何提示或建议都值得赞赏!
答案 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个字符(包括逗号)直到字符串结尾的所有内容)