2015-10-09 2 views
2

Учитывая эти данные кадры ...:Python панды условной замены строки на основе столбца значений

DF = pd.DataFrame({'COL1': ['A', 'B', 'C', 'D','D','D'], 
        'COL2': [11032, 1960, 11400, 11355, 8, 7], 
        'year': ['2016', '2017', '2018', '2019', '2020', '2021']}) 
DF 

    COL1 COL2 year 
0 A 11032 2016 
1 B 1960 2017 
2 C 11400 2018 
3 D 11355 2019 
4 D 8  2020 
5 D 7  2021 

DF2 = pd.DataFrame({'ColX': ['D'], 'ColY':['2021'], 'ColZ':[100] 
DF2 
     ColX ColY ColZ 
    0  D  2021 100 

Если следующие условия:

COL1 = ColX из DF2

год = Коли от DF2

Затем измените значение в COL2 на ColZ из DF2.

+0

Что делать, если для одинаковых совпадающих пар 'ColX' и' ColY' было несколько значений ColZ? – Alexander

+0

Не будет, обещаю. –

+0

DF2 ['ColY'] должен быть ['2021'] правильный? Он говорит, что 2012 год, но 2021 на выходе. – Alexander

ответ

2

Похоже, вы хотите получить updateDF с данными от DF2.

Предполагая, что все значения в DF2 являются уникальными для данной пары значений в ColX и ColY:

DF = DF.merge(DF2.set_index(['ColX', 'ColY'])[['ColZ']], 
       how='left', 
       left_on=['COL1', 'year'], 
       right_index=True) 
DF.COL2.update(DF.ColZ) 
del DF['ColZ'] 

>>> DF 
    COL1 COL2 year 
0 A 11032 2016 
1 B 1960 2017 
2 C 11400 2018 
3 D 11355 2019 
4 D  8 2020 
5 D 100 2021 

я сливаться временный dataframe (DF2.set_index(['ColX', 'ColY'])[['ColZ']]) в DF, который добавляет все значения из ColZ, где его индекс (ColX и ColY) соответствуют значениям от COL1 и year в DF. Все несоответствующие значения заполняются NA.

Затем я использую update для перезаписывания значений в DF.COL2 из ненулевых значений в DF.ColZ.

Затем я удаляю DF ['ColZ'] для очистки.

Если ColZ соответствует существующему имени столбца в DF, вам необходимо внести некоторые изменения.

Альтернативное решение заключается в следующем:

DF = DF.set_index(['COL1', 'year']).update(DF2.set_index(['ColX', 'ColY'])) 
DF.reset_index(inplace=True) 

Выходной сигнал идентичен выше.

+0

Как песня идет: Спасибо ... спасибо ... слава богу за ветер под моими крыльями ... –

+0

Еще одна вещь (надеюсь): Что делать, если я хочу добавить условие: если меньше всех условий (2) выполнены (найдены), замените текущее значение на «n/a»? –

+0

С помощью первого метода, приведенного выше, я считаю, что DF.ColZ предоставит вам то, что вы хотите (то есть не удаляйте его). Это все соответствующие значения из DF2, учитывая ваши два условия, с n/a для непревзойденных значений. – Alexander

Смежные вопросы