熊猫-有条件地连接两列

时间:2019-05-13 20:15:52

标签: python pandas concat

给出一个数据框

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

1 个答案:

答案 0 :(得分:1)

您可以将str.containscase=False一起使用,而只需使用pandas 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