Python 从熊猫列表中创建一个分类数据框,其中包括品牌&;型号名称
我有一个熊猫数据框,在1列中有汽车品牌名称和汽车型号,在1列中有汽车价格,如下所示Python 从熊猫列表中创建一个分类数据框,其中包括品牌&;型号名称,python,pandas,Python,Pandas,我有一个熊猫数据框,在1列中有汽车品牌名称和汽车型号,在1列中有汽车价格,如下所示 car_name car_price BMW M50 50000 Tesla Model 3 14000 BMW M3 Series 20500 Mercedes G500 45000 Mercedes E200 12300 如何对car_name列进行分类,使数据框中有3列,如下所示: car_brand car_model
car_name car_price
BMW M50 50000
Tesla Model 3 14000
BMW M3 Series 20500
Mercedes G500 45000
Mercedes E200 12300
如何对car_name列进行分类,使数据框中有3列,如下所示:
car_brand car_model car_price
BMW M50 50000
Tesla Model 3 14000
BMW M3 Series 20500
Mercedes G500 45000
Mercedes E200 12300
我还有一份仅包括car_品牌名称的清单,如:
[Mercedes, BMW, Hyundai, KIA, Tesla, Chevrolet]
那么,我如何告诉Pandas DataFrame将car_name列中的所有行分组到car_brand和car_model列中呢?前提是汽车名称列数据的第一部分始终为汽车品牌,而汽车名称数据的第二部分始终为汽车型号
提前谢谢 试试以下方法:
car_brand =['Mercedes', 'BMW', 'Hyundai', 'KIA', 'Tesla', 'Chevrolet']
pat=r'({})'.format('|'.join(car_brand))
#'(Mercedes|BMW|Hyundai|KIA|Tesla|Chevrolet)'
用于:
您可以使用
df.column。将method与lambda
函数应用于此处:
df=pd.DataFrame([{
…:“汽车名称”:“宝马M50”,
…:“汽车价格”:“50000”
...: },
...: {
…:“汽车名称”:“特斯拉3型”,
…:“汽车价格”:“14000”
...: },
...: {
…:“汽车名称”:“宝马M3系列”,
…:“汽车价格”:“20500”
...: },
...: {
…:“汽车名称”:“梅赛德斯G500”,
…:“汽车价格”:“45000”
...: },
...: {
…:“车名”:“梅赛德斯E200”,
…:“汽车价格”:“12300”
...: }])
df
汽车名称汽车价格
0宝马M50 50000
1特斯拉3型14000
2宝马M3系列20500
3梅赛德斯G500 45000
4梅赛德斯E200 12300
df[“car_brand”]=df.car_name.apply(lambda x:x.split()[0])
df[“car\u model”]=df.car\u name.apply(lambda x:x.split(“,1)[1])
df
汽车名称汽车价格汽车品牌汽车型号
0宝马M50 50000宝马M50
1特斯拉3型14000特斯拉3型
2宝马M3系列20500宝马M3系列
3梅赛德斯G500 45000梅赛德斯G500
4梅赛德斯E200 12300梅赛德斯E200
使用re.split()也可以实现同样的功能:
埃米尔,谢谢你的回复。然而,对于你的代码,两个字的汽车品牌名称是行不通的。例如,如果汽车名称为“Aston Martin DB11”。该代码将使“阿斯顿”成为car_品牌,“Martin DB11”部分成为car_模型。这就是为什么我创建了一个不同的特定汽车品牌名称列表,以便代码能够识别“阿斯顿”是否真的是一个汽车品牌。不过这是个好把戏。谢谢!非常感谢。这起作用了。你能解释一下或者分享一个我能更深入理解代码的链接吗?具体来说,“pat=r'({})格式('|'.join(car_brand))+'(.+)”部分我不清楚。Thanks@NijatBehbudov-只能接受一个答案。@NijatBehbudov-super,所以我认为解释是从被接受的回答者那里得到的,所以等待anky_91
谢谢!这起作用了。你能解释一下或者分享一个我能更深入理解代码的链接吗?特别是这一部分:pat=r'({}).format('|'.join(car_brand))@NijatBehbudov'|'.join(car_brand)
用一个管道连接一个列表(如果你只是打印这个)。如果您看到示例,那么我们将它绑定到一个元组中:)我发现格式很好。当我将许多项添加到car_brand列表中时,python抛出一个错误:“传递的项数错误2,placement暗示1”实际列表比这个长:car_brand=雅库拉、阿尔法罗密欧、阿斯顿马丁、亚视、奥迪、北汽、宾利、BMC、宝马、宝马阿尔皮纳、华晨、别克、比亚迪、凯迪拉克、Can Am、长安、奇瑞、雪佛兰、克莱斯勒、雪铁龙、达契亚、大宇、DAF、大发苏、大运、第聂伯、道奇、东风、一汽、法拉利、菲亚特、福特、福田、加布罗、GAC、GAZ'、'吉利'、'通用汽车'、'长城'、'豪爵'、'哈雷戴维森']@NijatBehbudov我测试了您提供的大列表(您刚刚给出)的测试数据框架,它工作正常。我认为这是一个单独的问题,检查您收到错误的行,并尝试调试/发布另一个问题(如果您愿意)
df['car_brand']=df.car_name.str.extract(pat)
df['car_model']=df.pop('car_name').str.replace(pat,'').str.strip()
print(df)
car_price car_brand car_model
0 50000 BMW M50
1 14000 Tesla Model 3
2 20500 BMW M3 Series
3 45000 Mercedes G500
4 12300 Mercedes E200
car_brand =['Mercedes', 'BMW', 'Hyundai', 'KIA', 'Tesla', 'Chevrolet']
pat=r'({})'.format('|'.join(car_brand)) + '(.+)'
df[['car_brand','car_model']] = df.pop('car_name').str.extract(pat)
print (df)
car_price car_brand car_model
0 50000 BMW M50
1 14000 Tesla Model 3
2 20500 BMW M3 Series
3 45000 Mercedes G500
4 12300 Mercedes E200
import re
df['car_model']=df['car_name'].apply(lambda x: re.split('|'.join(car_brand), x)[1])