Условное объединение Pandas DataFrames в Python

У меня есть 2 DataFrames, которые в настоящее время выглядят так:

raw_data = {'SeriesDate':['2017-03-10','2017-03-13','2017-03-14','2017-03-15','2017-03-16','2017-03-17']}
import pandas as pd
df1 = pd.DataFrame(raw_data,columns=['SeriesDate'])
df1['SeriesDate'] = pd.to_datetime(df['SeriesDate'])
print df1

 SeriesDate
0 2017-03-10
1 2017-03-13
2 2017-03-14
3 2017-03-15
4 2017-03-16
5 2017-03-17

raw_data2 = {'SeriesDate':['2017-03-10','2017-03-13','2017-03-14','2017-03-15','2017-03-16'],'NewSeriesDate':['2017-03-11','2017-03-12','2017-03-13','2017-03-14','2017-03-14']}
df2 = pd.DataFrame(raw_data2,columns=['SeriesDate','NewSeriesDate'])
df2['SeriesDate'] = pd.to_datetime(df['SeriesDate'])
print df2

SeriesDate NewSeriesDate
0 2017-03-10    2017-03-11
1 2017-03-13    2017-03-12
2 2017-03-14    2017-03-13
3 2017-03-15    2017-03-14
4 2017-03-16    2017-03-14

1) Я хотел бы объединить кадры данных таким образом, чтобы для всех 'SeriesDate' в df1 до 15 марта значения 'NewSeriesDate' были взяты из df2.

2) Для любой 'SeriesDate' в df1 после 15 марта или для любой 'SeriesDate', которой нет в df2, 'NewSeriesDate' должна быть рассчитана следующим образом:

from pandas.tseries.offsets import BDay
df1['NewSeriesDate'] = df1[''SeriesDate'] - BDay(1)

В качестве примера, мой последний DataFrame в этом сценарии будет выглядеть так:

raw_data3 = {'SeriesDate':['2017-03-10','2017-03-13','2017-03-14','2017-03-15','2017-03-16','2017-03-17'],'NewSeriesDate':['2017-03-11','2017-03-12','2017-03-13','2017-03-14','2017-03-15','2017-03-16']}
finaldf = pd.DataFrame(raw_data3,columns=['SeriesDate','NewSeriesDate'])
finaldf['SeriesDate'] = pd.to_datetime(df['SeriesDate'])
print finaldf

 SeriesDate NewSeriesDate
0 2017-03-10    2017-03-11
1 2017-03-13    2017-03-12
2 2017-03-14    2017-03-13
3 2017-03-15    2017-03-14
4 2017-03-16    2017-03-15
5 2017-03-17    2017-03-16

Я новичок в Pandas, поэтому не знаю, как применить условное слияние, кто-нибудь может подсказать, пожалуйста?

1 ответ

Попробуйте это. Это может быть немного чище, но делает свое дело. Вы не уточнили, что произойдет, если дата точно 15 марта, поэтому я сделал предположение. Возможно, я выключил некоторые заголовки, но вы поняли:

import pandas as pd
from pandas.tseries.offsets import BDay
import numpy as np

df1 = pd.DataFrame({
    'SeriesDate':pd.to_datetime(['3/10/17','3/13/17','3/14/17','3/15/17','3/16/17','3/17/17']),
    })

df1['NewSeries'] = np.nan

df2 = pd.DataFrame({
    'SeriesDate':pd.to_datetime(['3/10/17','3/13/17','3/14/17','3/15/17','3/16/17']),
    'NewSeries':pd.to_datetime(['3/11/17','3/12/17','3/13/17','3/14/17','3/14/17'])
    })

d = pd.to_datetime('3/15/17')

df1.loc[df1['SeriesDate'] <= d]  = df1.loc[df1['SeriesDate'] <= d].set_index('SeriesDate') \
    .combine_first(df2.loc[df2['SeriesDate'] <= d].set_index('SeriesDate')).reset_index()

df1.loc[df1['SeriesDate'] > d, 'NewSeries'] = df1['SeriesDate'] - BDay(1)
Другие вопросы по тегам