Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从熊猫列表中创建一个分类数据框,其中包括品牌&;型号名称_Python_Pandas - Fatal编程技术网

Python 从熊猫列表中创建一个分类数据框,其中包括品牌&;型号名称

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

我有一个熊猫数据框,在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_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])