2017-05-13 77 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