Обновить столбец на основе другого столбца и удалить данные из другого - PullRequest
0 голосов
/ 18 декабря 2018

Предположим, что df выглядит так:

import pandas as pd
df = pd.DataFrame(data={'fname':['Anky','Anky','Tom','Harry','Harry','Harry'],'lname':['sur1','sur1','sur2','sur3','sur3','sur3'],'role':['','abc','def','ghi','','ijk'],'mobile':['08511663451212','+4471123456','0851166346','','0851166347',''],'Pmobile':['085116634512','1234567890','8885116634','','+353051166347','0987654321']})

import numpy as np
df.replace('',np.nan,inplace=True)

df:

    fname   lname   role    mobile          Pmobile         
0   Anky    sur1    NaN    08511663451212   085116634512    
1   Anky    sur1    abc    +4471123456      1234567890      
2   Tom     sur2    def    0851166346       8885116634      
3   Harry   sur3    ghi    NaN              NaN             
4   Harry   sur3    NaN    0851166347       +353051166347   
5   Harry   sur3    ijk    NaN              0987654321      

Поэтому я хочу обновить столбец mobile со значениями из Pmobile, где начинаются значенияс '08','8','+353 и одновременно он должен удалить значение из поля Pmobile, где он находит совпадение и копирует данные в поле mobile.

В настоящее время я получаю это по:

df.mobile.update(df['Pmobile'][df['Pmobile'].str.startswith(('08','8','+353'),na=False)])
df.Pmobile[df.mobile==df.Pmobile] = np.nan

df:

    fname   lname   role    mobile          Pmobile 
0   Anky    sur1    NaN     085116634512    NaN 
1   Anky    sur1    abc     +4471123456     1234567890  
2   Tom     sur2    def     8885116634      NaN 
3   Harry   sur3    ghi     NaN             NaN 
4   Harry   sur3    NaN     +353051166347   NaN 
5   Harry   sur3    ijk     NaN             0987654321  

Есть ли способ сделать это на лету?

Заранее спасибо.:)

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете использовать shift, чтобы сместить столбцы влево, сделайте следующее:

In[50]:

df.loc[df['Pmobile'].str.startswith(('08','8','+353'),na=False), ['mobile','Pmobile']] = df[['mobile','Pmobile']].shift(-1,axis=1)
df
Out[50]: 
   fname lname role         mobile     Pmobile
0   Anky  sur1  NaN   085116634512         NaN
1   Anky  sur1  abc    +4471123456  1234567890
2    Tom  sur2  def     8885116634         NaN
3  Harry  sur3  ghi            NaN         NaN
4  Harry  sur3  NaN  +353051166347         NaN
5  Harry  sur3  ijk            NaN  0987654321

Поэтому используйте ваше условие, чтобы замаскировать интересующие строки, а затем назначить результат этих 2столбцы сдвинуты влево на 1, если условие выполнено.

Это оставит NaN, если значение сместилось, и ничего не сделает, если условие не выполнено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...