pandas 具有其他列值的条件新列

hgqdbh6s  于 2023-09-29  发布在  其他
关注(0)|答案(1)|浏览(72)

如果其他列为空或不符合条件,如何循环遍历一个嵌套框并创建一个新列。基本上要创建的是一个if语句,其中PM No_为空,然后选择No_并清除所有不需要的字符。我试过了。

result_list=[] 
    for i, row in df.iterrows():
    if(df['PM No_'].iloc[i]!=''):
        if df['Condition'].iloc[i] == '9':
           result = df['No_'].str.split('-0G',expand=True)[0]
           result_list.append(result)
    else:
        result=(row['PM No_']) 
        result_list.append(result)
    df['test']=result_list

这就是我想要的样子。如果PM No_为空,则取No_代替,如果Condition为9,则在添加到新列时从No_中删除-0G。我也有一些其他的条件,如如果条件是1,然后从No_中删除-0S。
| PM编号_|条件|不--|测试|
| --|--|--|--|
| GVSU10K20H| 1 |GVSU10K20H| GVSU10K20H|
| 1Y002VMH| 5 |1Y002VMH-0H| 1Y002VMH-0H|
| | 2NX00ESRU-0G| 2NX00ESRU| 2NX00ESRU |
| 20WNGE| 2 |20瓦|20WNGE|
| | C33761-0S| C33761| C33761 |

s3fp2yjn

s3fp2yjn1#

假设空单元格是NaN,使用fillnamaskstr.replace

df['test'] = df['PM No_'].fillna(df['No_']
                                 .mask(df['Condition'].eq(9),
                                       df['No_'].str.replace('-0G$', '',
                                                             regex=True))
                                )

输出量:

PM No_  Condition           No_        test
0  GVSU10K20H          1    GVSU10K20H  GVSU10K20H
1    1Y002VMH          5   1Y002VMH-0H    1Y002VMH
2         NaN          9  2NX00ESRU-0G   2NX00ESRU
3      20WNGE          2        20WNGE      20WNGE
4         NaN          1     C33761-0S   C33761-0S

如果你有空字符串:

df['test'] = (df['PM No_']
              .mask(df['PM No_'].eq(''),
                    df['No_'].mask(df['Condition'].eq(9),
                                   df['No_'].str.replace('-0G$', '',
                                                         regex=True))
                    )
             )

输出量:

PM No_  Condition           No_        test
0  GVSU10K20H          1    GVSU10K20H  GVSU10K20H
1    1Y002VMH          5   1Y002VMH-0H    1Y002VMH
2                      9  2NX00ESRU-0G   2NX00ESRU
3      20WNGE          2        20WNGE      20WNGE
4                      1     C33761-0S   C33761-0S

多个条件

如果有多个条件,因为字符串操作不容易向量化,请使用循环,这里使用自定义函数

def clean(no, condition):
    out = []
    for n, c in zip(no, condition):
        if c == 1:
            n = n.removesuffix('-0S')
        elif c == 9:
            n = n.removesuffix('-0G')
        out.append(n)
    return pd.Series(out, index=no.index)

df['test'] = df['PM No_'].mask(df['PM No_'].eq(''), clean(df['No_'], df['Condition']))

或者,如果所有操作都包括删除后缀:

def clean(no, condition):
    suffixes = {1: '-0S', 9: '-0G'}
    return pd.Series([n.removesuffix(suffixes.get(c, ''))
                      for n, c in zip(no, condition)],
                     index=no.index)

df['test'] = df['PM No_'].mask(df['PM No_'].eq(''), clean(df['No_'], df['Condition']))

输出量:

PM No_  Condition           No_        test
0  GVSU10K20H          1    GVSU10K20H  GVSU10K20H
1    1Y002VMH          5   1Y002VMH-0H    1Y002VMH
2                      9  2NX00ESRU-0G   2NX00ESRU
3      20WNGE          2        20WNGE      20WNGE
4                      1     C33761-0S      C33761

相关问题