2015-02-07 63 views
2

我有一个数据帧df1,其中索引是DatetimeIndex,并且有5列col1,col2,col3,col4,col5。数据框将一些列与系列相乘

我有另一个df2,它有一个几乎相等的datetimeindex(df1中可能缺少df1的某些天)和一个'Value'列。

我想在日期相同的情况下将df1就地乘以来自df2的值。但不适用于所有列col1 ... col5,只col1 ... col4

我可以看到它可以乘以col1 * Value,然后col2 * Value等等,并组成一个新的数据帧替换df1。

有没有更高效的方法?

回答

3

你一个实现这一目标,通过重新编制第二数据帧,使他们有相同的形状,然后使用数据框操作mul

创建日期时间序列两个数据帧。第二个只使用工作日来确保我们在两者之间存在差距。将日期设置为索引。

import pandas as pd 
# first frame 
rng1 = pd.date_range('1/1/2011', periods=90, freq='D') 
df1 = pd.DataFrame({'value':range(1,91),'date':rng1}) 
df1.set_index('date', inplace =True) 

# second frame with a business day date index 
rng2 = pd.date_range('1/1/2011', periods=90, freq='B') 
df2 = pd.DataFrame({'date':rng2}) 
df2['value_to_multiply'] = range(1-91) 
df2.set_index('date', inplace =True) 

重新索引与第一个索引的第二个帧。 Df1现在在非营业日期间会出现第一次有效观察。

# reindex the second dataframe to match the first 
df2 =df2.reindex(index= df1.index, method = 'ffill') 

通过DF1 [ 'value_to_multiply_by']多DF2:

# multiple filling nans with 1 to avoid propagating nans 
# nans can still exists if there are no valid previous observations such as at the beginning of a dataframe 
df1.mul(df2['value_to_multiply_by'].fillna(1), axis=0) 
+0

更新,以使其更易于理解 – JAB 2015-02-07 19:01:32

+0

这是非常接近我所需要的,除了两件事情: 1.数据I在df1中有不恒定的,我需要填充NA与每个从前一行的值。 2.是否有一种方法可以进行多路转换? – MMM 2015-02-07 21:16:51

+0

reindex有一个称为'方法'的参数,可以用来填补新索引中的空白。 ''填充''取最后一次有效的观察结果和''填充''下一个有效的观察结果。更新了代码以包含它。数据不一定是恒定的 - 这仅仅是一个例子。 – JAB 2015-02-07 21:31:09

相关问题