在Python中条件合并Pandas DataFrames

时间:2017-04-20 11:23:55

标签: python python-2.7 pandas dataframe

我有2个DataFrame,目前看起来像这样:

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)我想以这样的方式加入数据帧:对于3月15日之前df1中的所有'SeriesDate','NewSeriesDate'值应取自df2。

2)对于3月15日之后df1中的任何'SeriesDate'或任何不在df2中的'SeriesDate','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 个答案:

答案 0 :(得分:0)

试一试。它可能会更清洁一点,但可以做到这一点。你没有说明如果日期正好是3月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)