繁体   English   中英

子集行的熊猫总和并在DF中重新合并

[英]Pandas sum of subset rows and re-merge in DF

我有一个DF,根据以下内容:

      id_var1   id_var2  num_var1   num_var2
      1         1        1          1
      1         2        1          0
      1         3        2          0
      1         4        2          3
      1         5        3          3
      1         6        3          3
      1         7        3          0 
      1         8        4          0
      2         1        1          0
      2         2        2          1
      2         3        5          0
      2         4        2          0
      2         5        1          2  
      2         6        1          2
      2         7        2          0

我想要具有以下外观的DF:

      id_var1   id_var2  num_var1   num_var2   row_sum
      1         1        1          1          2      
      1         2        1          0          NaN
      1         3        2          0          Nan
      1         4        2          3          11
      1         5        3          3          Nan
      1         6        3          3          Nan
      1         7        3          0          Nan
      1         8        4          0          Nan
      2         1        1          0          Nan
      2         2        2          1          7
      2         3        5          0          Nan
      2         4        2          0          Nan
      2         5        1          2          4
      2         6        1          2          Nan
      2         7        2          0          Nan

在每个不为0的第一个 num_var2处,我想求和(num_var1)相同的行+与num_var2状态一样多的行。

示例1 :第4行的num_var2 = 3->第4行的sum( num_var1 )+ 3行向下= id_var1 = 1和id_var2 = 4的第11行

例2:第12行具有num_var2 = 2 - >总和(num_var1)用于行12个+ 2行向下= 4 id_var1 = 2和id_var2 = 5。

有人可以帮我这个吗? 可以在没有慢行触发的情况下完成吗?

DF的代码如下:

df = pd.DataFrame({ 'id_var1' : [1] * 8 + [2] * 7
                    ,'id_var2' : [i for i in range(1,9)] + [i for i in range(1,8)]
                   ,'num_var1' : [1,1,2,2,3,3,3,4] + [1,2,5,2,1,1,2]
               ,'num_var2' : [1, 0,0,3,3,3,0,0] + [0,1,0,0,2,2,0]
              })

让我知道这是否适合您。

首先从num_var1列创建值列表。 然后获得子列表的总和-从num_var1创建,从当前索引到所需的编号项(取自num_var2列)。

仅当前一条记录的num_var2与当前记录的num_var2不匹配时,才调用sublst()函数。

import pandas as pd

df = pd.DataFrame({ 'id_var1' : [1] * 8 + [2] * 7
                    ,'id_var2' : [i for i in range(1,9)] + [i for i in range(1,8)]
                   ,'num_var1' : [1,1,2,2,3,3,3,4] + [1,2,5,2,1,1,2]
               ,'num_var2' : [1, 0,0,3,3,3,0,0] + [0,1,0,0,2,2,0]
              })

num_var1  =df['num_var1'].tolist() # values to be used for calcualtion
df['index1'] = df.index

def sublst(row):
    if row['num_var2']>0:
        x= num_var1[row['index1']:row['index1']+row['num_var2']+1]
        return sum(x)

df['sum'] = df[df.num_var2 != df.num_var2.shift()].apply(sublst,axis=1)

print df

产量

       id_var1  id_var2  num_var1  num_var2  index1   sum
0         1        1         1         1       0   2.0
1         1        2         1         0       1   NaN
2         1        3         2         0       2   NaN
3         1        4         2         3       3  11.0
4         1        5         3         3       4   NaN
5         1        6         3         3       5   NaN
6         1        7         3         0       6   NaN
7         1        8         4         0       7   NaN
8         2        1         1         0       8   NaN
9         2        2         2         1       9   7.0
10        2        3         5         0      10   NaN
11        2        4         2         0      11   NaN
12        2        5         1         2      12   4.0
13        2        6         1         2      13   NaN
14        2        7         2         0      14   NaN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM