如何将一个 pandas 数据框中的所有小时值与另一个数据框中的年度值相乘?
How to multiply all hourly values in one pandas dataframe with yearly values in another dataframe?
我有以下每小时数据框 dfA:
Date/Time Value1 Value2
01.03.2010 00:00:00 60 10
01.03.2010 01:00:00 50 20
01.03.2010 02:00:00 52 30
01.03.2010 03:00:00 49 40
.
.
.
31.12.2013 23:00:00 77 50
我还有第二个数据框 dfB,带有年度值:
Date/Time Value1 Value2
31.12.2010 1.5 0.9
31.12.2011 1.6 1.1
31.12.2012 1.7 2.3
31.12.2013 1.3 0.6
我想将 dfA 中的每个小时值乘以数据帧 dfB 中相应年份的因子。
结果应如下所示:
Date/Time Value1 Value2
01.03.2010 00:00:00 90 9
01.03.2010 01:00:00 75 18
01.03.2010 02:00:00 78 27
01.03.2010 03:00:00 73.5 36
.
.
.
31.12.2013 23:00:00 100.1 30
我一直在尝试使用 dfC = dfA*dfB[dfA.index.year()]
,但出现错误 TypeError: 'numpy.ndarray' object is not callable
。
谁能帮我解决这个问题?
假设你从
开始
dfA = pd.DataFrame({
'Date/Time': ['01.03.2010 00:00:00'],
'Value1': [60],
'Value2': [10]})
dfB = pd.DataFrame({
'Date/Time': ['01.03.2010'],
'Value1': [1.5],
'Value2': [0.9]})
向每个 DataFrame 添加一个 'year'
列:
dfA['year'] = pd.to_datetime(dfA['Date/Time'])
dfB['year'] = pd.to_datetime(dfB['Date/Time'])
现在只需按此列进行左合并:
>>> pd.merge(
dfA,
dfB,
left_on='year',
right_on='year',
how='left')
Date/Time_x Value1_x Value2_x year Date/Time_y Value1_y Value2_y
0 01.03.2010 00:00:00 60 10 2010-01-03 01.03.2010 1.5 0.9
请注意,合并添加了后缀 '_x'
和 '_y'
。
在此合并之后,您可以按常规方式乘以列,删除不需要的列等。
最简单的方法可能是将较低频率的系列/数据帧上采样到较高频率,然后相乘。
In [82]: s1 = pd.Series(np.random.randn(31), index=pd.date_range(start='2015-01-01', end='2015-01-31', freq='d'))
In [83]: s2 = pd.Series(np.random.randn(4), index=pd.date_range(start='2015-01-01', end='2015-01-31', freq='W'))
In [84]: s2.resample('d').mean().reindex(s1.index).ffill().bfill() * s1
Out[84]:
2015-01-01 0.361944
2015-01-02 2.806391
2015-01-03 0.741745
2015-01-04 0.855619
2015-01-05 -2.127828
...
2015-01-27 0.533919
2015-01-28 0.792278
2015-01-29 1.722754
2015-01-30 0.822032
2015-01-31 0.729741
Freq: D, dtype: float64
在这种情况下,我们需要额外的 redindex(s1.index)
,因为起点和终点没有完全对齐。
您可以尝试附加到 df1
df1.index.year
的索引,然后将 df2
的索引更改为 years
,然后使用 mul
:
print df1
Value1 Value2
Date/Time
2010-01-03 00:00:00 60 10
2010-01-03 01:00:00 50 20
2010-01-03 02:00:00 52 30
2010-01-03 03:00:00 49 40
2013-12-31 23:00:00 77 50
print df2
Value1 Value2
Date/Time
2010-12-31 1.5 0.9
2011-12-31 1.6 1.1
2012-12-31 1.7 2.3
2013-12-31 1.3 0.6
df1 = df1.set_index(df1.index.year, append=True)
df2.index = df2.index.year
print df1
Value1 Value2
Date/Time
2010-01-03 00:00:00 2010 60 10
2010-01-03 01:00:00 2010 50 20
2010-01-03 02:00:00 2010 52 30
2010-01-03 03:00:00 2010 49 40
2013-12-31 23:00:00 2013 77 50
print df2
Value1 Value2
2010 1.5 0.9
2011 1.6 1.1
2012 1.7 2.3
2013 1.3 0.6
print df1.mul(df2, level=1).reset_index(drop=True, level=1)
Value1 Value2
Date/Time
2010-01-03 00:00:00 90.0 9
2010-01-03 01:00:00 75.0 18
2010-01-03 02:00:00 78.0 27
2010-01-03 03:00:00 73.5 36
2013-12-31 23:00:00 100.1 30
我有以下每小时数据框 dfA:
Date/Time Value1 Value2
01.03.2010 00:00:00 60 10
01.03.2010 01:00:00 50 20
01.03.2010 02:00:00 52 30
01.03.2010 03:00:00 49 40
.
.
.
31.12.2013 23:00:00 77 50
我还有第二个数据框 dfB,带有年度值:
Date/Time Value1 Value2
31.12.2010 1.5 0.9
31.12.2011 1.6 1.1
31.12.2012 1.7 2.3
31.12.2013 1.3 0.6
我想将 dfA 中的每个小时值乘以数据帧 dfB 中相应年份的因子。
结果应如下所示:
Date/Time Value1 Value2
01.03.2010 00:00:00 90 9
01.03.2010 01:00:00 75 18
01.03.2010 02:00:00 78 27
01.03.2010 03:00:00 73.5 36
.
.
.
31.12.2013 23:00:00 100.1 30
我一直在尝试使用 dfC = dfA*dfB[dfA.index.year()]
,但出现错误 TypeError: 'numpy.ndarray' object is not callable
。
谁能帮我解决这个问题?
假设你从
开始dfA = pd.DataFrame({
'Date/Time': ['01.03.2010 00:00:00'],
'Value1': [60],
'Value2': [10]})
dfB = pd.DataFrame({
'Date/Time': ['01.03.2010'],
'Value1': [1.5],
'Value2': [0.9]})
向每个 DataFrame 添加一个 'year'
列:
dfA['year'] = pd.to_datetime(dfA['Date/Time'])
dfB['year'] = pd.to_datetime(dfB['Date/Time'])
现在只需按此列进行左合并:
>>> pd.merge(
dfA,
dfB,
left_on='year',
right_on='year',
how='left')
Date/Time_x Value1_x Value2_x year Date/Time_y Value1_y Value2_y
0 01.03.2010 00:00:00 60 10 2010-01-03 01.03.2010 1.5 0.9
请注意,合并添加了后缀 '_x'
和 '_y'
。
在此合并之后,您可以按常规方式乘以列,删除不需要的列等。
最简单的方法可能是将较低频率的系列/数据帧上采样到较高频率,然后相乘。
In [82]: s1 = pd.Series(np.random.randn(31), index=pd.date_range(start='2015-01-01', end='2015-01-31', freq='d'))
In [83]: s2 = pd.Series(np.random.randn(4), index=pd.date_range(start='2015-01-01', end='2015-01-31', freq='W'))
In [84]: s2.resample('d').mean().reindex(s1.index).ffill().bfill() * s1
Out[84]:
2015-01-01 0.361944
2015-01-02 2.806391
2015-01-03 0.741745
2015-01-04 0.855619
2015-01-05 -2.127828
...
2015-01-27 0.533919
2015-01-28 0.792278
2015-01-29 1.722754
2015-01-30 0.822032
2015-01-31 0.729741
Freq: D, dtype: float64
在这种情况下,我们需要额外的 redindex(s1.index)
,因为起点和终点没有完全对齐。
您可以尝试附加到 df1
df1.index.year
的索引,然后将 df2
的索引更改为 years
,然后使用 mul
:
print df1
Value1 Value2
Date/Time
2010-01-03 00:00:00 60 10
2010-01-03 01:00:00 50 20
2010-01-03 02:00:00 52 30
2010-01-03 03:00:00 49 40
2013-12-31 23:00:00 77 50
print df2
Value1 Value2
Date/Time
2010-12-31 1.5 0.9
2011-12-31 1.6 1.1
2012-12-31 1.7 2.3
2013-12-31 1.3 0.6
df1 = df1.set_index(df1.index.year, append=True)
df2.index = df2.index.year
print df1
Value1 Value2
Date/Time
2010-01-03 00:00:00 2010 60 10
2010-01-03 01:00:00 2010 50 20
2010-01-03 02:00:00 2010 52 30
2010-01-03 03:00:00 2010 49 40
2013-12-31 23:00:00 2013 77 50
print df2
Value1 Value2
2010 1.5 0.9
2011 1.6 1.1
2012 1.7 2.3
2013 1.3 0.6
print df1.mul(df2, level=1).reset_index(drop=True, level=1)
Value1 Value2
Date/Time
2010-01-03 00:00:00 90.0 9
2010-01-03 01:00:00 75.0 18
2010-01-03 02:00:00 78.0 27
2010-01-03 03:00:00 73.5 36
2013-12-31 23:00:00 100.1 30