【问题标题】:Multi-index combined reverse cumsum in PandasPandas中的多索引组合反向累积
【发布时间】:2022-06-10 23:18:47
【问题描述】:

我想对二维相空间中的所有剩余条目求和。对于我有一个 2d 多索引并且我想单独获取每个 v1 的 cumsum 的情况,执行以下操作就足够了:

df['output'] = df.loc[::-1].groupby(['v1'])['value'].cumsum()[::-1]

v1 v2 value output
1 1 1 3
1 2 1. 2.
1 3 1 1.
2 1 1. 3.
2 2 1. 2.
2 3. 1. 1.
3 1 1. 3.
3 2 1. 2.
3 3 1. 1.

但我想同时集成 v1 和 v2。例如如果 v1=2 和 v2=3,我想要结果 (v1=2 & v2=3) + (v1=3 & v2&3)。或者对于同一张表,想要的结果:

v1 v2 value output
1 1 1 9
1 2 1. 6.
1 3 1 3.
2 1 1. 6.
2 2 1. 4.
2 3. 1. 2.
3 1 1. 3.
3 2 1. 2.
3 3 1. 1.

任何想法如何做到这一点?

【问题讨论】:

  • 我不确定发生了什么,但似乎是(df.v1 *df.v2)[::-1]

标签: python pandas


【解决方案1】:

我不确定您的确切要求,但要在数据框中执行此操作,最好只遍历每一行并分别对索引大于索引值的行中的值求和,对于行:

    for i, data in df.iterrows():
        df.loc[i, 'output'] = df.loc[(df.v2 >= row.v2) & (df.v1 >= row.v1), 'value'].sum()

对于给定的数据框,这会产生预期的结果:

    df = pd.DataFrame({'v1': [1, 1, 1, 2, 2, 2, 3, 3, 3],
                       'v2': [1, 2, 3, 1, 2, 3, 1, 2, 3],
                       'value': [1, 1, 1, 1, 1, 1, 1, 1, 1]})
    for i, data in df.iterrows():
        df.loc[i, 'output'] = df.loc[(df.v2 >= df.v2[i]) & (df.v1 >= df.v1[i]), 'value'].sum()

    print(df)

        v1  v2  value  output
     0   1   1      1     9.0
     1   1   2      1     6.0
     2   1   3      1     3.0
     3   2   1      1     6.0
     4   2   2      1     4.0
     5   2   3      1     2.0
     6   3   1      1     3.0
     7   3   2      1     2.0
     8   3   3      1     1.0

请注意,在此处迭代行与调用 groupbycumsum 一样有效(如果不是更高)。更好的方法是将其视为numpy 中的下三角(子)二维数组,并对它们执行求和运算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2021-01-15
    • 2020-09-13
    • 2017-01-30
    • 2021-07-28
    相关资源
    最近更新 更多