根据其他列中包含的字符串为列分配条件值

时间:2018-12-19 03:22:09

标签: python pandas dataframe assign

我正在尝试根据其他列中可能包含的字符串来分配一列。例如

var1 = 67

columns = {'col1': ['string1', 'thang2', 'code3', 'string2'], 
          'col2': [1, 2, np.nan, 3], 'col3': ['I', 'cant', 'think', 'what']}

df = pd.DataFrame(data = columns)

然后,我如何制作第四列col4,在大多数情况下为col3 + var1 + col1,但每当np.nancol2时为nan(在

?并且在-W的任何字符串中再次有'in'时,是否在其值后附加col1

我对assign一无所知,但是我不知道如何在赋值中完成所有这些有条件的工作,或者在创建列之后是否有办法做到这一点,我不确定

1 个答案:

答案 0 :(得分:4)

您可以使用np.where进行尝试:

df['col4'] = np.where(df['col2'].notnull(),
                      df['col3'] + str(var1) + np.where(df['col1'].str.contains('in'),
                                                        df['col1'] + '-w',
                                                        df['col1']), 
                      np.nan)

输出:

      col1  col2   col3             col4
0  string1   1.0      I     I67string1-w
1   thang2   2.0   cant     cant67thang2
2    code3   NaN  think              NaN
3  string2   3.0   what  what67string2-w

或者如果您想使用assign

df.assign(col5 = np.where(df['col2'].notnull(),
         df['col3'] + str(var1) + np.where(df['col1'].str.contains('in'),
                                           df['col1'] + '-w',
                                           df['col1']), 
         np.nan))

输出:

      col1  col2   col3             col4             col5
0  string1   1.0      I     I67string1-w     I67string1-w
1   thang2   2.0   cant     cant67thang2     cant67thang2
2    code3   NaN  think              NaN              NaN
3  string2   3.0   what  what67string2-w  what67string2-w

更新:由于您提到速度。我想我也应该删除.str访问器并使用列表推导。

df['col4'] = np.where(df['col2'].notnull(),
         df['col3'] + str(var1) + np.where(['in' in i for i in df['col1']], 
                                           df['col1'] + '-w', 
                                           df['col1']), 
         np.nan)