Несколько условий Python Pandas - PullRequest
       15

Несколько условий Python Pandas

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

У меня есть два кадра данных панд. Один - источник, а другой - пункт назначения. Я хочу обновить на основе нескольких условий значения обоих фреймов данных. исходный фрейм данных выглядит следующим образом:

     Old_ID    New_ID   DATE      dt_insert
     FIRM345   FIRM21   21.11.19  11.11.19
     FIRM321   FIRM41   19.10.19  18.10.19

целевой фрейм данных выглядит следующим образом

     Old_ID    New_ID   DATE     
     FIRM345   FIRM21   21.11.19
     FIRM321   FIRM41   19.10.19

Я хочу знать, есть ли способ применить следующую логику без использования циклов:

, если src.old_ID == dest.old_id AND src.new_id == dest.new_id AND src.date == dest.date

THD dest.dt_insert = src.date

ИЛИ добавить строку src к целевому фрейму данных

Ответы [ 2 ]

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

Вы можете решить вашу проблему следующим образом:

  1. внешний фрейм данных назначения внешнего соединения с фреймом данных источника на нескольких ключах (Old_ID, New_ID, DATE);
  2. заменить значение вdt_insert столбец со значением из DATE столбца, если ключи слияния наблюдения найдены в обоих кадрах данных;
  3. удалить вспомогательный столбец _merge.

    import pandas as pd
    
    src_data = [{'Old_ID': 'FIRM345', 'New_ID': 'FIRM21', 'DATE': '21.11.19', 'dt_insert': '11.11.19'},
                {'Old_ID': 'FIRM321', 'New_ID': 'FIRM41', 'DATE': '19.10.19', 'dt_insert': '18.10.19'},
                {'Old_ID': 'FIRM333', 'New_ID': 'FIRM31', 'DATE': '20.10.19', 'dt_insert': '20.10.19'}]
    
    dest_data = [{'Old_ID': 'FIRM345', 'New_ID': 'FIRM21', 'DATE': '21.11.19'},
                 {'Old_ID': 'FIRM321', 'New_ID': 'FIRM41', 'DATE': '19.10.19'}]
    
    df_src = pd.DataFrame(src_data)
    print(df_src)
    
    #        DATE  New_ID   Old_ID dt_insert
    # 0  21.11.19  FIRM21  FIRM345  11.11.19
    # 1  19.10.19  FIRM41  FIRM321  18.10.19
    # 2  20.10.19  FIRM31  FIRM333  20.10.19
    
    df_dest = pd.DataFrame(dest_data)
    print(df_dest)
    
    #        DATE  New_ID   Old_ID
    # 0  21.11.19  FIRM21  FIRM345
    # 1  19.10.19  FIRM41  FIRM321
    
    df_dest_new = pd.merge(left=df_dest, right=df_src, how='outer', 
                           on=['Old_ID', 'New_ID', 'DATE'], indicator=True)
    df_dest_new['dt_insert'] = df_dest_new[['DATE', 'dt_insert', '_merge']].apply(lambda x: x[0] if x[2] == 'both' else x[1], axis=1)
    df_dest_new = df_dest_new.drop(labels='_merge', axis=1)
    print(df_dest_new)
    
    #        DATE  New_ID   Old_ID dt_insert
    # 0  21.11.19  FIRM21  FIRM345  21.11.19
    # 1  19.10.19  FIRM41  FIRM321  19.10.19
    # 2  20.10.19  FIRM31  FIRM333  20.10.19
    
1 голос
/ 22 октября 2019

Это должно работать

import pandas as pd

data = {'Old_ID':['FIRM345', 'FIRM321', 'FIRM11'], 'New_ID':['Firm21','FIRM41','FIRM42'],
        'DATE':['21.11.19', '19.10.19', '19.12.19'], 'dt_insert':['11.11.19','18.10.19','18.12.19']}
data2 = {'Old_ID':['FIRM345', 'FIRM321','FIRM12'], 'New_ID':['Firm21','FIRM41', 'FIRM43'],
        'DATE':['21.11.19', '19.10.19','19.12.19']}
src = pd.DataFrame(data)
dest = pd.DataFrame(data2)

print(src)
print(dest)

if src.Old_ID.any() == dest.Old_ID.any() and src.New_ID.any() == dest.New_ID.any() and\
    src.DATE.any() == dest.DATE.any():
    dest['dt_insert'] = src.DATE
else:
    src.append(dest)

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