對于DataFrame df以下
df = pd.DataFrame([('Tesla','Model3', '-', 'Motor'),
('Tesla', 'ModelS', '-', 'MotorMD3'),
('Tesla', 'ModelX', '-', 'MotorMD3'),
('Tesla', 'ModelY', '-', 'Motor'),
('Jeep', 'Wrangler','Grouped','Engine'),
('Jeep', 'Compass', 'Grouped','EngineMD3'),
('Jeep', 'Patriot', 'Grouped','Engine'),
('Jeep', 'Cherokee','Grouped','Engine'),
('Ford', 'Mustang', 'Grouped','Engine'),
('Ford', 'F150', 'Grouped','Engine') ],columns=['Make','Model','Status','Type'])
df
Make Model Status Type
0 Tesla Model3 - Motor
1 Tesla ModelS - MotorMD3
2 Tesla ModelX - MotorMD3
3 Tesla ModelY - Motor
4 Jeep Wrangler Grouped Engine
5 Jeep Compass Grouped EngineMD3
6 Jeep Patriot Grouped Engine
7 Jeep Cherokee Grouped Engine
8 Ford Mustang Grouped Engine
9 Ford F150 Grouped Engine
我正在嘗試Type使用EngineMD3for all更新該列Make,如果EngineMD3存在于其中的任何一個Models中Make,并且如果Status是Grouped針對那個Make。但如果Status不是Grouped,Type則應按原樣保留Models。如果“EngineMD3”不存在,Type則應保持為Engine.
例如,Teslais not Grouped,因此每個模型都保持Type相同。但是JeepisGrouped并且Compassis 有它的Typeas EngineMD3,所以EngineMD3更新 as the Typefor all Jeep Models。Ford是Grouped,但沒有一個Models有型別EngineMD3,所以Type保持為Engine
預期產出
Make Model Status Type
0 Tesla Model3 - Motor #For Tesla Type is maintained for each model seperately since it is not grouped
1 Tesla ModelS - MotorMD3
2 Tesla ModelX - MotorMD3
3 Tesla ModelY - Motor
4 Jeep Wrangler Grouped EngineMD3 #Since Jeep is grouped, all its Type is changed to EngineMD3 since one of the model had EngineMD3
5 Jeep Compass Grouped EngineMD3
6 Jeep Patriot Grouped EngineMD3
7 Jeep Cherokee Grouped EngineMD3
8 Ford Mustang Grouped Engine #Even though Ford is grouped, since there is no EngineMD3 the Type is maintained as Engine.
9 Ford F150 Grouped Engine
換句話說,條件適用于所有makes(例如吉普車)如果make被分組并且如果FD3附加到任何模型types,那么同一組中的所有分組模型make都將附加 FD3
我嘗試使用多個條件np.select更新Type列,但我無法給出一次選擇所有相同的條件Make并更新Type. 請幫助我在這里沒有選擇。
uj5u.com熱心網友回復:
df.loc[df.Status.eq('Grouped'), 'Type'] = df[df.Status.eq('Grouped')].groupby('Make').Type.transform(
lambda x: 'EngineMD3' if x.eq('EngineMD3').any() else x)
Make Model Status Type
0 Tesla Model3 - Motor
1 Tesla ModelS - MotorMD3
2 Tesla ModelX - MotorMD3
3 Tesla ModelY - Motor
4 Jeep Wrangler Grouped EngineMD3
5 Jeep Compass Grouped EngineMD3
6 Jeep Patriot Grouped EngineMD3
7 Jeep Cherokee Grouped EngineMD3
8 Ford Mustang Grouped Engine
9 Ford F150 Grouped Engine
uj5u.com熱心網友回復:
你可以試試這個:
def process(g):
if sum(g.Status=='Grouped')>0:
g['Type'] = 'EngineMD3' if sum(g.Type=='EngineMD3')>0 else 'Engine'
return g
df.groupby('Make').apply(process)
輸出:
Make Model Status Type
0 Tesla Model3 - Motor
1 Tesla ModelS - MotorMD3
2 Tesla ModelX - MotorMD3
3 Tesla ModelY - Motor
4 Jeep Wrangler Grouped EngineMD3
5 Jeep Compass Grouped EngineMD3
6 Jeep Patriot Grouped EngineMD3
7 Jeep Cherokee Grouped EngineMD3
8 Ford Mustang Grouped Engine
9 Ford F150 Grouped Engine
uj5u.com熱心網友回復:
我們可以使用以下功能:
def trans(s_1, s_2, s_3):
Make_values, new_col = [], []
for i in range(len(s_1)):
if s_3[i]=="EngineMD3" and s_2[i]=="Grouped":
Make_values.append(s_1[i])
for i in range(len(Make_values)):
for j in range(len(s_3)):
if s_1[j]==Make_values[i]:
new_col.append("EngineMD3")
else:
new_col.append(s_3[j])
return new_col
我們應用它:
df['Type']=trans(df['Make'], df['Status'], df['Type'])
uj5u.com熱心網友回復:
我不是 python 專家,我相信有更多的最佳解決方案......但這里有一個。
- 檢查查詢的長度 > 0。
- 如果它 > 0,那么我們存盤滿足您在 y 變數中提到的條件的 Make 值。
- 然后我們替換該特定 Make 的 Type。
if len(df.query("Status == 'Grouped' & Type.str.startswith('EngineMD3')")) > 0:
x = df.query("Status == 'Grouped' & Type.str.startswith('EngineMD3')")['Make'].values
for i in range(len(x)):
y = x[i]
df['Type'].loc[df['Make'] == y] = 'EnginerMD3'
display(df)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/526249.html
上一篇:資料框在一列中重復列值
下一篇:分析和過濾資料框中的調查回應
