【问题标题】:dataframe multiply some columns with a series数据框将一些列与一系列相乘
【发布时间】:2015-04-07 16:53:02
【问题描述】:

我有一个数据框 df1,其中索引是 DatetimeIndex,并且有 5 列,col1、col2、col3、col4、col5。

我有另一个 df2,它具有几乎相等的 datetimeindex(df1 的某些日子可能会从 df1 中丢失)和一个“值”列。

当日期相同时,我想将 df1 原位乘以 df2 的值。但不是所有列 col1...col5,只有 col1...col4

我可以看到可以将 col1*Value 相乘,然后 col2*Value 等等...并组成一个新的数据框来替换 df1。

有没有更有效的方法?

【问题讨论】:

    标签: pandas


    【解决方案1】:

    您可以通过重新索引第二个数据框使它们具有相同的形状,然后使用数据框运算符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 乘以 df2['value_to_multiply_by']:

    # 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)
    

    【讨论】:

    • 这与我需要的非常接近,除了两件事: 1. 我在 df1 中的数据不是恒定的,我需要用前一行中的每个值填充 NA。 2.有没有办法就地做mul?
    • reindex 有一个名为method 的参数,可用于填补新索引中的空白。 'ffill' 接受最后一个有效观察,'bfill' 接受下一个有效观察。更新了代码以包含它。数据不必是恒定的——这只是一个例子。
    • @JBradley 不错的答案!我编辑了您的答案,以便 df 名称与问题匹配。我也认为你想在做乘法之前fillna(1),而不是ffill,对吧?
    • @exp1orer 是的,您对fillna(1) 的看法是正确的。在示例中,框架中的前两天是非工作日,因此没有有效的意见可以提出来填补它们
    • 啊,这是一个关于所需行为的问题——对于非工作日,OP 是否只想要来自 df1 的值,或者 OP 是否也想要乘以插值(填充)来自df2的值?
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2022-01-23
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多