【问题标题】:Multiplying Dataframe rows with numpy array将 Dataframe 行与 numpy 数组相乘
【发布时间】:2018-04-09 03:14:52
【问题描述】:

我有一个如下所示的 DataFrame:

         Date   Last  portfolioID FinancialInstrument
1   2018-03-28  64.67            1                 Oil
2   2018-03-29  64.91            1                 Oil
3   2018-04-02  62.85            1                 Oil
4   2018-04-03  63.57            1                 Oil
5   2018-04-04  63.56            1                 Oil
6   2018-04-05  63.73            1                 Oil
7   2018-04-06  61.93            1                 Oil
8   2018-03-23  65.74            3                 Oil
9   2018-03-26  65.49            3                 Oil
10  2018-03-27  64.67            3                 Oil
11  2018-03-28  64.67            3                 Oil
12  2018-03-29  64.91            3                 Oil
13  2018-04-02  62.85            3                 Oil
14  2018-04-03  63.57            3                 Oil
15  2018-04-04  63.56            3                 Oil
16  2018-04-05  63.73            3                 Oil
17  2018-04-06  61.93            3                 Oil
18  2018-04-02  62.85            5                 Oil
19  2018-04-03  63.57            5                 Oil
20  2018-04-04  63.56            5                 Oil
21  2018-04-05  63.73            5                 Oil
22  2018-04-06  61.93            5                 Oil

还有一个如下所示的 NumPy 数组:

[ 152.69506795   76.05719501  127.28719173]

我正在使用 portfolioID 对 DataFrame 进行分组,其中第一个分组与 NumPy 数组中的第一个值相关,第二个组与 NumPy 数组中的第二个值相关,等等。我的问题是,有没有一种方法可以相乘DataFrame 中的Last 列及其对应的 NumPy 数组值?

这是我所拥有的,但我收到一条错误消息,指出“长度必须相等”。 shares 是 NumPy 数组:

for pid, group in data.groupby('portfolioID'):
    lastCol = group.Last
    clumN = lastCol.multiply(shares, axis=0)

【问题讨论】:

    标签: python arrays pandas numpy


    【解决方案1】:

    您可以使用pandas.Series.factorize 将索引获取到您的值数组中,并使用这些索引获取适当的数组以进行相乘。

    val_arr = np.array([152.69506795, 76.05719501, 127.28719173])
    
    df.Last * val_arr[df.portfolioID.factorize()[0]]
    
    # 1     9874.790044
    # 2     9911.436861
    # 3     9596.885021
    # 4     9706.825470
    # 5     9705.298519
    # 6     9731.256680
    # 7     9456.405558
    # 8     5000.000000
    # 9     4980.985701
    # 10    4918.618801
    # 11    4918.618801
    # 12    4936.872528
    # 13    4780.194706
    # 14    4834.955887
    # 15    4834.195315
    # 16    4847.125038
    # 17    4710.222087
    # 18    8000.000000
    # 19    8091.646778
    # 20    8090.373906
    # 21    8112.012729
    # 22    7882.895784
    # Name: Last, dtype: float64
    

    【讨论】:

      【解决方案2】:

      使用count 计算df 中每个组的出现次数,并使用np.repeat 调整第二个数组arr 的大小。

      arr = np.array([152.69506795, 76.05719501, 127.28719173])
      df.Last * np.repeat(arr, df.groupby("portfolioID")["Last"].count())
      

      【讨论】:

        猜你喜欢
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        • 2019-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多