我有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年,因为我会将其减少1.05。
有什么建议吗? 谢谢你的帮助
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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