Замена значений в одном столбце значениями в другом - PullRequest
1 голос
/ 05 октября 2019

У меня есть следующий образец df

import pandas as pd
DateChange = [list(['11/04/1911', '03/06/1919']),
          list(['01/27/1918', '03/27/1984']),
          list(['01/26/1912', '01/15/1918', '02/06/1917'])]
DateGrab = [list(['10.31.11', '03-02-1919']), list(['01-23-18', '03-23-1984']),
       list(['1-22-12', '01.11.18', '2.2.17'])]
df= pd.DataFrame({'Text':['Hey 10.31.11  22|1|13 03-02-1919 d',
                              'things here 01-23-18 or 03-23-1984 then ',
                                  'stuff 1-22-12 01.11.18 or 2.2.17 so so '],
                          'ID': ['E1','E2', 'E3'],
                  'DateChange' : DateChange,
                  'DateGrab' : DateGrab

                          })

Что выглядит как

                DateChange                 DateGrab                 ID   Text
0   [11/04/1911, 03/06/1919]             [10.31.11, 03-02-1919]     E1  Hey 10.31.11 22|1|13 03-02-1919 d
1   [01/27/1918, 03/27/1984]             [01-23-18, 03-23-1984]     E2  things here 01-23-18 or 03-23-1984 then    
2   [01/26/1912, 01/15/1918, 02/06/1917] [1-22-12, 01.11.18, 2.2.17]E3  stuff 1-22-12 01.11.18 or 2.2.17 so so

Моя цель такова:

1) Если DateGrabзначение, например, 10.31.11 присутствует в Text, замените это значение в Text на значение DateChange например, 11/04/1911

2) Создайте новый столбец

Таким образом, мой желаемый выводследующим образом

    DateChange DateGrab ID  Text   New_Text
0                                  Hey 11/04/1911 22|1|13 03/06/1919 d
1                                  things here 01/27/1918 or 03/27/1984 then    
2                                  stuff 01/26/1912 01/15/1918 or 02/06/1917 so so

Я попробовал приведенный ниже код, но он не работает

df['New_Text']= df['Text'].replace(df.Text, df.DateChange)

Как мне добиться желаемого результата?

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Попробуйте воспользоваться df.replace по словарю

d = {i: dict(zip(dt_grab, dt_change))  for i, (dt_change, dt_grab) 
                                       in enumerate(zip(df.DateChange, df.DateGrab))}

df['New_Text'] = df[['Text']].T.replace(d, regex=True).T

In [30]: df[['New_Text']]
Out[30]:
                                           New_Text
0              Hey 11/04/1911  22|1|13 03/06/1919 d
1        things here 01/27/1918 or 03/27/1984 then
2  stuff 01/26/1912 01/15/1918 or 02/06/1917 so so
1 голос
/ 05 октября 2019

Вы можете использовать взорвать в пандах 0.25.1:

s=df['DateChange'].explode()
s.index=df['DateGrab'].explode()
d=s.to_dict()
for key in d:
    df['New_Text']=df['Text'].str.replace(key,d[key])  
print(df)

                                       Text  ID  \
0        Hey 10.31.11  22|1|13 03-02-1919 d  E1   
1  things here 01-23-18 or 03-23-1984 then   E2   
2   stuff 1-22-12 01.11.18 or 2.2.17 so so   E3   

                             DateChange                     DateGrab  \
0              [11/04/1911, 03/06/1919]       [10.31.11, 03-02-1919]   
1              [01/27/1918, 03/27/1984]       [01-23-18, 03-23-1984]   
2  [01/26/1912, 01/15/1918, 02/06/1917]  [1-22-12, 01.11.18, 2.2.17]   

                                      New_Text  
0           Hey 10.31.11  22|1|13 03-02-1919 d  
1     things here 01-23-18 or 03-23-1984 then   
2  stuff 1-22-12 01.11.18 or 02/06/1917 so so   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...