2017-05-13 64 views
1

我有2个数据帧如下:数据帧操作

DF1:

 id  Grade   Date 
1  78  15  2016-05-23 
2  99  12  2015-08-01 

DF2:

    rate 
2015-01-01  1.22 
2015-02-01  1.12 
    ... 
2015-05-01  1.05 
2017-01-01  1.33 

我想与速率乘以甲级DF1同一月份的df2。 因此对于2016-05-23这是在05个月,我会mulyplu它1.05。

有什么建议吗? 谢谢大家帮忙

+1

还能有多重'df2'中同一月的情况?如果同一个月出现在'df2'的两个不同年份呢?预期产出的最终形式是什么?你到目前为止还没有尝试过什么? –

回答

2

如果您的DF2指标设置为每月PeriodIndex

In [11]: df2.index = df2.index.to_period("M") 

In [12]: df2 
Out[12]: 
     rate 
2015-01 1.22 
2015-02 1.12 
2016-05 1.32 
2015-08 1.23 

现在,你可以有效地拔出率与df2.loc

In [13]: df2.loc[df1.Date.dt.to_period("M")]["rate"] 
Out[13]: 
2016-05 1.32 
2015-08 1.23 
Freq: M, Name: rate, dtype: float64 

现在,你可以乘:

In [14]: df2.loc[df1.Date.dt.to_period("M")]["rate"].values * df1["Grade"] 
Out[14]: 
1 19.80 
2 14.76 
Name: Grade, dtype: float64 


In [21]: df1["NormedGrade"] = df2.loc[df1.Date.dt.to_period("M")]["rate"].values * df1["Grade"] 

In [22]: df1 
Out[22]: 
    id Grade  Date Normed Grade 
1 78  15 2016-05-23   19.80 
2 99  12 2015-08-01   14.76 
+0

谢谢你的工作!还有一个问题,如果df2日期指数处于四分之一频率,我应该改变什么? – hdatas

+0

@hdatas'.dt.to_period(“Q”)' –

1

设置

df1 
Out[903]: 
    id Grade  Date 
1 78  15 2016-05-23 
2 99  12 2015-08-01 

df2 
Out[904]: 
     Date rate 
0 2015-01-01 1.22 
1 2015-02-01 1.12 
2 2015-05-01 1.05 
3 2017-01-01 1.33 

解决方案

#extract month from date and put it in a new column 
df1['month'] = df1.Date.apply(lambda x: x.month) 
df2['month'] = df2.Date.apply(lambda x: x.month) 
#merge two dfs to get the rate 
df3 = pd.merge(df1,df2,how='left',on='month') 
#multiply grade by its rate. 
df3['Grade_rate'] = df3.Grade*df3.rate 
df3 
Out[897]: 
    id Grade  Date_x month  Date_y rate Grade_rate 
0 78  15 2016-05-23  5 2015-05-01 1.05  15.75 
1 99  12 2015-08-01  8  NaT NaN   NaN 
0

如果你能只靠其在df2一个月的一个实例,这里有一个工作解决方案:

首先,根据OP的例子生成样本数据。
请注意,df2中的第一个日期已更改为演示两个不同月份数的功能。

df1 = pd.DataFrame([[78, 15, "2016-05-23"], 
        [99, 12, "2015-08-01"]], 
        columns=['id', 'Grade', 'Date']) 

df2 = pd.DataFrame([["2015-08-01", 1.22], 
        ["2015-02-01", 1.12], 
        ["2015-05-01", 1.05], 
        ["2017-01-01", 1.33]], 
        columns=['Date','rate']) 

现在从每个DataFrame提取一个月的数字并保存为新列:

df1['month_num'] = pd.to_datetime(df1.Date).dt.month 
df2['month_num'] = pd.to_datetime(df2.Date).dt.month 

最后,计算的df1.Grade和产品相关的rate

df1['Grade_X_rate'] = df1.Grade.multiply(df1.merge(df2[['month_num','rate']], 
                on="month_num", 
                how="left").rate 
             ) 

    id Grade  Date month_num Grade_X_rate 
0 78  15 2016-05-23   5   15.75 
1 99  12 2015-08-01   8   14.64