【问题标题】:How to multiply all hourly values in one pandas dataframe with yearly values in another dataframe?如何将一个熊猫数据框中的所有小时值与另一个数据框中的年值相乘?
【发布时间】:2016-06-05 09:40:28
【问题描述】:

我有以下每小时数据帧 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。 谁能帮我解决这个问题?

【问题讨论】:

    标签: python-2.7 pandas dataframe criteria multiplication


    【解决方案1】:

    假设你开始

    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'

    在此合并之后,您可以按常规方式将列相乘,删除不需要的列,等等。

    【讨论】:

    • 感谢您的回答。
    【解决方案2】:

    您可以尝试追加到df1df1.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
    

    【讨论】:

    • 不错。不知道你可以直接将 DataFrame 相乘。
    • 感谢您的回答。这种方式似乎在我的代码中效果最好。
    【解决方案3】:

    最简单的方法可能是将较低频率的序列/数据帧上采样到较高频率,然后相乘。

    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),因为开始和结束不完全对齐。

    【讨论】:

    • 感谢您的回答。
    猜你喜欢
    • 2022-01-23
    • 2019-06-30
    • 2019-01-20
    • 1970-01-01
    • 2017-04-14
    • 2017-12-08
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多