Условное объединение 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)