我有两个时间序列的pandas数据帧,一个具有每日值(df1低于),另一个带有年度值(df2低于)。一个例子是:
df1 df2
Date Value Year Value
2002-01-01 3 2002 0.5
2002-01-02 3.5 2003 3.1
2002-01-03 3.3 2004 2.7
... ... ... ...
2010-01-01 4.96 2010 0.7
2010-01-02 4.98
我想按如下方式执行操作:如果每日日期与年度日期在同一年,则将每日日期乘以年度值。
例如,2002年的每日值都会乘以标量0.5,2003年的每日值都会乘以标量3.1等。
有没有人有过这类问题的经验?
答案 0 :(得分:0)
我认为您可以先从Date
列找到year
,df1
df2
和Year
列df1['Year'] = df1.Date.dt.year
df = pd.merge(df1,df2, on='Year', suffixes=('', '_x') )
print df
Date Value Year Value_x
0 2002-01-01 3.00 2002 0.5
1 2002-01-02 3.50 2002 0.5
2 2002-01-03 3.30 2002 0.5
3 2010-01-01 4.96 2010 0.7
4 2010-01-02 4.98 2010 0.7
df['Value'] = df['Value'].mul(df['Value_x'])
print df[['Date','Value']]
Date Value
0 2002-01-01 1.500
1 2002-01-02 1.750
2 2002-01-03 1.650
3 2010-01-01 3.472
4 2010-01-02 3.486
,最后一个用{ {3}}:
In [1386]: %timeit a(df1,df2)
100 loops, best of 3: 10.9 ms per loop
In [1387]: %timeit b(df3,df4)
1 loops, best of 3: 4.11 s per loop
<强>计时强>:
#length(df1) = 50k
df1 = pd.concat([df1]*10000).reset_index(drop=True)
df3 = df1.copy()
df4 = df2.copy()
def a(df1,df2):
df1['Year'] = df1.Date.dt.year
df = pd.merge(df1,df2, on='Year', suffixes=('', '_x') )
#print df
df['Multiple'] = df['Value'].mul(df['Value_x'])
return df.drop('Value_x', axis=1)
def b(df1,df2):
mapping = df2.set_index('Year').to_dict()['Value']
df1['Year'] = df1['Date'].dt.year
df1['Multiple'] = df1.apply(lambda x: x['Value']*mapping[x['Year']], axis=1)
return df1
print a(df1,df2)
print b(df3,df4)
代码:
GL.MultMatrix()
答案 1 :(得分:0)
您可以通过逐行应用将年份映射到系数的字典来执行此操作。
关注示例中介绍的数据框:
mapping = df2.set_index('Year').to_dict()['Value']
mapping
{2002: 0.5,
2003: 3.1000000000000001,
2004: 2.7000000000000002,
2010: 0.69999999999999996}
df1['Year'] = df1['Date'].dt.year
df1['Adjusted Value'] = df1.apply(lambda x: x['Value']*mapping[x['Year']], axis=1)
df1
Date Value Year Adjusted Value
0 2002-01-01 3.00 2002 1.500
1 2002-01-02 3.50 2002 1.750
2 2002-01-03 3.30 2002 1.650
3 2010-01-01 4.96 2010 3.472
4 2010-01-02 4.98 2010 3.486