使用Date进行数据框操作

时间:2017-05-13 04:07:00

标签: python date pandas datetime

我有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。

有什么建议吗? 谢谢你的帮助

3 个答案:

答案 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