根据以下内容我有一个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
答案 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