首页 > 解决方案 > Pandas - 有条件地连接两列

问题描述

给定一个数据框

Patient ID     Instructions    ID Replaced
   1                N/A           ID123
   2                              ID124
   3                              ID125
   4                xyz           ID126
   5                xyz           ID127
   6                              ID128
   7                Replacement   ID129
   8                Replace       ID130
   9                replaced      ID131
   10               xyz           ID132

如果找到子字符串Instructions,如何创建一个新列?ID Replacedreplac

Patient ID  Instructions    ID Replaced     Comments
    1           N/A            ID123    
    2                          ID124    
    3                          ID125    
    4           xyz            ID126    
    5           xyz            ID127    
    6                          ID128    
    7           Replacement    ID129    Replacement | ID129
    8           Replace        ID130    Replace | ID130
    9           Replaced       ID131    Replaced | ID131
    10          xyz            ID132    

我尝试了以下但该Comments列完全为空

mani_df['Comments'] = ""
# if instructions contains 'replac' , concat with ID replaced 
if "replace" in df['Instructions']:
    df['Comments'] = df['Instructions'].str.cat(df['ID Replaced'], sep = " | ")

我尝试使用布尔掩码,但这会为前两行返回 False

mask = mani_df['Special Handling Directions'].str.contains('replac')

    Out[55]: 
    0    False
    1    False
    2      NaN
    3      NaN

标签: pythonpandasconcat

解决方案


您可以使用str.containswithcase=False和 concat usingpandas indexing

mask = df.Instructions.str.contains('Replace', case=False).fillna(False)

df['Comments'] = df.loc[mask, 'Instructions'] + ' | ' + df['ID Replaced']

当然,fillna最后你可以得到空字符串(看起来像你预期的输出)

df.fillna('')

产量

    Patient ID  Instructions    ID Replaced Comments
0   1                           ID123   
1   2                           ID124       
2   3                           ID125       
3   4           xyz             ID126   
4   5           xyz             ID127   
5   6                           ID128       
6   7           Replacement     ID129       Replacement | ID129
7   8           Replace         ID130       Replace | ID130
8   9           replaced        ID131       replaced | ID131
9   10          xyz             ID132   

推荐阅读