For the DataFrame df below
df = pd.DataFrame([('Tesla','Model3', '-', 'Tesla'),
('Tesla', 'ModelS', '-', 'Tesla_MD3'),
('Tesla', 'ModelX', '-', 'Tesla_MD3'),
('Tesla', 'ModelY', '-', 'Tesla'),
('Jeep', 'Wrangler','Grouped','Jeep'),
('Jeep', 'Compass', 'Grouped','Jeep_MD3'),
('Jeep', 'Patriot', 'Grouped','Jeep'),
('Jeep', 'Cherokee','Grouped','Jeep'),
('Ford', 'Mustang', 'Grouped','Ford'),
('Ford', 'F150', 'Grouped','Ford') ],columns=['Make','Model','Status','Type'])
df
Make Model Status Type
0 Tesla Model3 - Tesla
1 Tesla ModelS - Tesla_MD3
2 Tesla ModelX - Tesla_MD3
3 Tesla ModelY - Tesla
4 Jeep Wrangler Grouped Jeep
5 Jeep Compass Grouped Jeep_MD3
6 Jeep Patriot Grouped Jeep
7 Jeep Cherokee Grouped Jeep
8 Ford Mustang Grouped Ford
9 Ford F150 Grouped Engine
I am trying to update the column Type with Make_MD3 for all same Make, if Make_MD3 is present in any of the Models in that Make, and if the Status is Grouped for that Make. But if the Status is not Grouped, Type should be kept as such for each Models. If 'Make_MD3' is not present the Type should be maintained as Make.
For instance, Tesla is not Grouped, so each model keeps their Type the same. But Jeep is Grouped, and Compass is having its Type as Jeep_MD3, so Jeep_MD3 is updated as the Type for all Jeep Models. Ford is Grouped but none of the Models have type Ford_MD3 so Type is kept as Ford
Expected output
Make Model Status Type
0 Tesla Model3 - Tesla #For Tesla Type is maintained for each model seperately since it is not grouped
1 Tesla ModelS - Tesla_MD3
2 Tesla ModelX - Tesla_MD3
3 Tesla ModelY - Tesla
4 Jeep Wrangler Grouped Jeep_MD3 #Since Jeep is grouped, all its Type is changed to Jeep_MD3 since one of the model had Jeep_MD3
5 Jeep Compass Grouped Jeep_MD3
6 Jeep Patriot Grouped Jeep_MD3
7 Jeep Cherokee Grouped Jeep_MD3
8 Ford Mustang Grouped Ford #Even though Ford is grouped, since there is no Ford_MD3 the Type is maintained as Ford.
9 Ford F150 Grouped Ford
In other words,
The conditions are for all the makes(eg. Jeeps) If the make is grouped and if MD3 is appended to any of the model types, then all the grouped models in the same make will have the MD3 appended to them.
I tried the below code but it doesn't work. Can someone fix that approach or try a new approach?
df.loc[df.Status.eq('Grouped'), 'Type'] = df[df.Status.eq('Grouped')].groupby('Make').Type.transform(
lambda x: f"{x.str.replace('_MD3','')}_{MD3}" if x.str.contains('_MD3').any() else x)
CodePudding user response:
Try:
df.loc[df.Status == "Grouped", "Type"] = (
df[df.Status == "Grouped"]
.groupby("Make")["Type"]
.transform(
lambda x: x.name "_MD3" if x.str.endswith("_MD3").any() else x.name
)
)
print(df)
Prints:
Make Model Status Type
0 Tesla Model3 - Tesla
1 Tesla ModelS - Tesla_MD3
2 Tesla ModelX - Tesla_MD3
3 Tesla ModelY - Tesla
4 Jeep Wrangler Grouped Jeep_MD3
5 Jeep Compass Grouped Jeep_MD3
6 Jeep Patriot Grouped Jeep_MD3
7 Jeep Cherokee Grouped Jeep_MD3
8 Ford Mustang Grouped Ford
9 Ford F150 Grouped Ford
