Замена значений в двух фреймах данных по индексу даты - Python Pandas - PullRequest
0 голосов
/ 22 октября 2018

Мне нужно заменить значения в одном фрейме данных на индекс взаимной даты другого фрейма.Здесь есть конкретные даты (с 5-го по 10-е), где значения столбца B должны быть заменены значениями в dataframe2.Я посмотрел на слияния / соединения / замены / и т.д., но не могу узнать, как это сделать.

import pandas as pd
import numpy as np

list1 = [10,80,6,38,41,54,12,280,46,21,46,22]
list2 = [4,3,22,6,'NA','NA','NA','NA','NA','NA',452,13]
list3 = ['2016-01-01', '2016-01-02','2016-01-03','2016-01-04','2016-01-05','2016-01-06',
         '2016-01-07','2016-01-08','2016-01-09','2016-01-10','2016-01-11','2016-01-12',]

dat = pd.DataFrame({'A' : list1, 'B' : list2, 'Date' : list3}, columns = ['A', 'B', 'Date'])
dat['Date'] = pd.to_datetime(dat['Date'], format = '%Y-%m-%d')
dat = dat.set_index('Date')
print(dat)

Значения 2016-01-05 to 2016-01-10 необходимо заменить значениями во втором кадре данных:

              A    B
Date                
2016-01-01   10    4
2016-01-02   80    3
2016-01-03    6   22
2016-01-04   38    6
2016-01-05   41   NA
2016-01-06   54   NA
2016-01-07   12   NA
2016-01-08  280   NA
2016-01-09   46   NA
2016-01-10   21   NA
2016-01-11   46  452
2016-01-12   22   13

Вот второй кадр данных, где этизначения должны быть "сопоставлены" в первом кадре данных:

list4 = [78,15,16,79,71,90]
list5 = ['2016-01-05','2016-01-06','2016-01-07','2016-01-08','2016-01-09','2016-01-10']
dat2 = pd.DataFrame({'B' : list4, 'Date' : list5}, columns = ['B', 'Date'])
dat2['Date'] = pd.to_datetime(dat2['Date'], format = '%Y-%m-%d')
dat2 = dat2.set_index('Date')
print(dat2)

             B
Date          
2016-01-05  78
2016-01-06  15
2016-01-07  16
2016-01-08  79
2016-01-09  71
2016-01-10  90

Окончательный результат должен выглядеть следующим образом:

              A    B
Date                
2016-01-01   10    4
2016-01-02   80    3
2016-01-03    6   22
2016-01-04   38    6
2016-01-05   41   78
2016-01-06   54   15
2016-01-07   12   16
2016-01-08  280   79
2016-01-09   46   71
2016-01-10   21   90
2016-01-11   46  452
2016-01-12   22   13

Любая помощь будетвысоко ценится!Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вы можете обновить ячейки по их местоположению (индекс и столбец), чтобы точно нацелить то, что вы обновляете:

replace = [pd.to_datetime(d) for d in ['2016-01-05', '2016-01-10']
dat.loc[replace, 'B'] = dat2.loc[replace, 'B']

Это гарантирует, что вы касаетесь только ожидаемых вами индексов и только тех столбцов, которые ожидаете.

EDIT: Здесь - документация для этого .loc метода.Я бы посмотрел на это, это очень универсальный инструмент.

EDIT2: Я видел, что вы на самом деле заменяете часть времени, а не только эти два значения.Этого также можно добиться с помощью .loc:

start, end = pd.to_datetime('2016-01-05'), pd.to_datetime('2016-01-10')
dat.loc[start:end, 'B'] = dat2.loc[start:end, 'B']
0 голосов
/ 22 октября 2018

В одну сторону, используя combine_first

df1 = dat2.combine_first(dat)

print (df1)

            A    B
Date        
2016-01-01  10  4.0
2016-01-02  80  3.0
2016-01-03  6   22.0
2016-01-04  38  6.0
2016-01-05  41  78.0
2016-01-06  54  15.0
2016-01-07  12  16.0
2016-01-08  280 79.0
2016-01-09  46  71.0
2016-01-10  21  90.0
2016-01-11  46  452.0
2016-01-12  22  13.0

Или используя DataFrame.update

dat.update(dat2)

Или вы также можете использовать .loc

dat.loc[dat2.index, 'B'] = dat2.loc[:, 'B'] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...