【问题标题】:Sum values in df1 based on .eq() in df2基于 df2 中的 .eq() 求和 df1 中的值
【发布时间】:2021-06-08 11:16:17
【问题描述】:

我想总结一些基于相同价格的市场交易量,比如 2017 年的 6 个小时。

我有一个数据框 df1 (market_volumes),其中包含某些区域的市场交易量。然后我有另一个 DataFrame,df2 (mFRR_price),其中包含一些市场价格。

df1
             Date  NO1 Up  NO1 Down  NO2 Up  ...  DK1 Up  DK1 Down  DK2 Up  DK2 Down
35062  31-12-2020    54.0       0.0   214.0  ...    33.0       0.0    31.0       0.0
35063  31-12-2020     3.0       0.0   121.0  ...   125.0       0.0    21.0       0.0
35064  31-12-2020     0.0     -28.0     0.0  ...     0.0      -9.0     0.0       0.0
35065  31-12-2020     0.0     -83.0     0.0  ...     0.0       0.0     0.0       0.0
35066  31-12-2020     0.0     -80.0     0.0  ...     0.0     -55.0     0.0       0.0
35067  31-12-2020     0.0     -42.0     0.0  ...    79.0       0.0    23.0       0.0

df2
             Date  NO1 Up  NO2 Up  NO3 Up  ...  SE4 Up  FI Up  DK1 Up  DK2 Up
35062  31-12-2020    47.4    47.4    27.2  ...    61.1   61.1    94.1    94.1
35063  31-12-2020    31.0    31.0    25.7  ...    58.0   35.3    89.4    89.4
35064  31-12-2020    24.8    24.8    24.8  ...    54.5   24.8    56.7    56.7
35065  31-12-2020    24.8    24.8    24.8  ...    51.2   28.0    52.4    52.4
35066  31-12-2020    24.6    24.6    24.6  ...    45.8   26.6    51.9    51.9
35067  31-12-2020    24.1    24.1    23.3  ...    24.1   24.1    78.7    78.7

现在,如果 df2 中的一行中的值等于“NO1 UP”列中的值,我想总结 df1 的市场交易量。

也就是说,我正在寻找一种方法来结束一个新的 DataFrame,这会导致:

df3
             Date  NO1 Up  NO1 Down  NO2 Up  ...  DK1 Up  DK1 Down  DK2 Up  DK2 Down    SUM
35062  31-12-2020    54.0       0.0   214.0  ...    33.0       0.0    31.0       0.0    (54+214)
35063  31-12-2020     3.0       0.0   121.0  ...   125.0       0.0    21.0       0.0    (3+121)
35064  31-12-2020     0.0     -28.0     0.0  ...     0.0      -9.0     0.0       0.0    etc.
35065  31-12-2020     0.0     -83.0     0.0  ...     0.0       0.0     0.0       0.0
35066  31-12-2020     0.0     -80.0     0.0  ...     0.0     -55.0     0.0       0.0
35067  31-12-2020     0.0     -42.0     0.0  ...    79.0       0.0    23.0       0.0

...因为它找到了相等的区域价格,并在 DataFrame 中对这些位置的市场交易量求和。

我一直在做这个:

market_volumes['sum'] = mFRR_price.eq(mFRR_price['NO1 Up'], axis=0).mul(mFRR_price['NO1 Up'], axis=0).sum(axis=1)

但它会将 df2 中的值相加,并将其放入 df1。我需要 df2 中的 POSITIONS,但需要 df1 中的值。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用 .loc 并应用布尔索引。

    df1.loc[df2['NO1 Up'] == df2['NO2 Up'], 'SUM'] = df1['NO1 Up'] + df1['NO2 Up']
    df1.loc[df2['NO1 Up'] != df2['NO2 Up'], 'SUM'] = 0
    

    第一行沿着 df2 的索引向下并检查 NO1 Up 和 NO2 Up 列中的值是否相等。然后它会创建一个名为“SUM”的列——这个新列的值取决于前面的布尔值的结果。我们说如果前面的布尔值为真,那么转到 SUM 列并执行以下操作:

    = df1['NO1 Up'] + df1['NO2 Up']
    

    相反,如果结果为 false,则 pandas 会将“NaN”插入到 SUM 列中。

    不确定您是否可以接受 NaN 值。大多数不是,所以第二行代码或多或少与第一行相反...如果 df2['NO1 Up'] != df2['NO2 Up'],则在 df1 SUM 列中插入整数 0。

    同样,可能还有其他方法可以实现您想要的。

    【讨论】:

      【解决方案2】:
      import pandas as pd
      df3['SUM'] = df3['NO1 Up'] + df3['NO2 Up']
      

      【讨论】:

      • 这几乎不能达到我正在寻找的目的。我正在尝试在 excel 中做类似于 SUMIF 的事情。我不需要简单的总和,但只需要在价格相同的那几个小时内的总和。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多