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

时间:2017-02-14 15:54:44

标签: python pandas

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

$ cat .gitattributes
* export-subst ident
$ cat foo.c
// Blob hash: $Id$
// Commit hash: $Format:%H%d$
$ git archive master | tar -xO
* export-subst ident
// Blob hash: $Id: 9e0569a55a4eaacdf8d100a2c3d3654cf767650b $
// Commit hash: 3802b7884faf182ce0994ac9d94925dad375be05 (HEAD -> master, tag: v2)

我想要一个具有以下外观的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

在每个 first num_var2不是0时,我想将(num_var1)与num_var2状态相同的行+多行相加。

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

示例2 :第12行 num_var2 = 2 - >第12行+ 2行的总和( num_var1 )= id_var1 = 2且 id_var2 = 5。

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

下面的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

1 个答案:

答案 0 :(得分: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