title: Conditional replacement of multiple columns based on column values in pandas DataFrame
body: <p>I would like to simultaneously replace the values of multiple columns with corresponding values in other columns, based on the values in the first group of columns (specifically, where the one of the first columns is blank). Here's an example of what I'm trying to do:</p>
  
  <pre><code>import pandas as pd
  
  df = pd.DataFrame({'a1':['m', 'n', 'o', 'p'],
                     'a2':['q', 'r', 's', 't'],
                     'b1':['',  '',  'a', '' ],
                     'b2':['',  '',  'b',  '']})
  
  df
  
  #   a1 a2 b1 b2
  # 0  m  q
  # 1  n  r
  # 2  o  s  a  b
  # 3  p  t
  </code></pre>
  
  <p>I'd like to replace the '' values in b1 and b2 with the corresponding values in a1 and a2, where b1 is blank:</p>
  
  <pre><code>#   a1 a2 b1 b2
  # 0  m  q  m  q
  # 1  n  r  n  r
  # 2  o  s  a  b
  # 3  p  t  p  t
  </code></pre>
  
  <p>Here's my thought process (I'm relatively new to pandas, so I'm probably speaking with a heavy R accent here):</p>
  
  <pre><code>missing = (df.b1 == '')
  
  # First thought:
  df[missing, ['b1', 'b2']] = df[missing, ['a1', 'a2']]
  # TypeError: 'Series' objects are mutable, thus they cannot be hashed
  
  # Fair enough  
  df[tuple(missing), ('b1', 'b2')] = df[tuple(missing), ('a1', 'a2')]
  # KeyError: ((True, True, False, True), ('a1', 'a2'))
  
  # Obviously I'm going about this wrong.  Maybe I need to use indexing?
  df[['b1', 'b2']].ix[missing,:]
  #   b1 b2
  # 0      
  # 1      
  # 3      
  
  # That looks right
  df[['b1', 'b2']][missing, :] = df[['a1', 'a2']].ix[missing, :]
  # TypeError: 'Series' objects are mutable, thus they cannot be hashed
  # Deja vu
  
  df[['b1', 'b2']].ix[tuple(missing), :] = df[['a1', 'a2']].ix[tuple(missing), :]
  # ValueError: could not convert string to float:
  # Uhh...
  </code></pre>
  
  <p>I could do it column-by-column:</p>
  
  <pre><code>df['b1'].ix[missing] = df['a1'].ix[missing]
  df['b2'].ix[missing] = df['a2'].ix[missing]
  </code></pre>
  
  <p>...but I suspect there's a more idiomatic way to do this. Thoughts?</p>
  
  <p><strong>Update:</strong> To clarify, I'm specifically wondering whether all columns can be updated at the same time. For instance, a hypothetical modification of Primer's answer (this doesn't work and results in NaNs, although I'm unsure why):</p>
  
  <pre><code>df.loc[missing, ['b1', 'b2']] = f.loc[missing, ['a1', 'a2']]
  
  #   a1 a2   b1   b2
  # 0  m  q  NaN  NaN
  # 1  n  r  NaN  NaN
  # 2  o  s    a    b
  # 3  p  t  NaN  NaN
  </code></pre>