首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据其他两个列的复杂条件更新列值

根据其他两个列的复杂条件更新列值
EN

Stack Overflow用户
提问于 2022-11-03 02:54:35
回答 4查看 43关注 0票数 2

对于下面的DataFrame df

代码语言:javascript
复制
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

我正在尝试用EngineMD3更新列EngineMD3,如果EngineMD3存在于该Make中的任何一个Models中,以及如果Status是该MakeGrouped,则为所有相同的Make。但是,如果Status不是Grouped,则应为每个Models保留Type。如果“EngineMD3”不存在,则Type应保持为Engine

例如,Tesla不是Grouped,因此每个模型都保持它们的Type相同。但是JeepGroupedCompassTypeEngineMD3,所以EngineMD3被更新为Type for all Jeep ModelsFordGrouped,但是没有一个Models具有EngineMD3类型,所以Type保持为Engine

预期产出

代码语言:javascript
复制
     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。请帮助我,我在这里没有选择了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-11-03 04:05:00

代码语言:javascript
复制
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)
代码语言:javascript
复制
    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
票数 0
EN

Stack Overflow用户

发布于 2022-11-03 03:40:26

我不是蟒蛇专家,我相信还有更好的解决方案.但这里有一个。

  1. 检查查询的长度> 0 .
  2. (如果>0),然后存储满足y变量中提到的条件的Make值。
  3. 然后替换特定Make的类型.

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2022-11-03 03:43:43

你可以试试这个:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74297709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档