如何使用两行中的值在熊猫数据框中创建一列?

时间:2020-05-29 16:59:39

标签: python pandas

如何执行此操作?

初始Df:

    A B C D
0   0 1 0 0
1   1 1 1 1
2   0 0 1 1
3   0 1 0 1
4   1 1 0 0
5   1 1 1 0

最终Df:

    A B C D Param1 Param2 Param3 
0   0 1 0 0      0      0      0
1   1 1 1 1      3      1      0
2   0 0 1 1      0      2      2
3   0 1 0 1      1      1      1
4   1 1 0 0      1      1      1
5   1 1 1 0      1      2      0

基本上我想做的是比较两个连续行上的值,并将这些比较的计数存储在新列中。

计算细节:
对于第一行(索引为0):Param1,Param2,Param3等于0

  1. Param1:这是从预览行开始的0在当前行中变为1的次数的计数,例如(看索引1):从索引0开始的三个0在索引1中转换为1,因此Param1对于索引1 = 3
  2. Param2:这是前一行中当前行中保持不变的1的计数,例如(请看索引3):索引2中的1保持不变,在索引3中,因此索引3的Param2 = 1
  3. Param3:这是前一行的1的计数,该数字在当前行中变为0,例如(请看索引2):两个1从索引1变为0,在索引2中,因此Param3用于索引3 = 2

2 个答案:

答案 0 :(得分:4)

您只需将diff推开,然后检查以下条件,即可:

d = df.diff()
df.assign(param1=d.eq(1).sum(1),
          param2=(d.eq(0)&df.eq(1)).sum(1),
          param3=d.eq(-1).sum(1))

   A  B  C  D  param1  param2  param3
0  0  1  0  0       0       0       0
1  1  1  1  1       3       1       0
2  0  0  1  1       0       2       2
3  0  1  0  1       1       1       1
4  1  1  0  0       1       1       1
5  1  1  1  0       1       2       0

答案 1 :(得分:2)

IIUC:

shift = df.shift()
df['Param1'] = (df.eq(1) & shift.eq(0)).sum(1).astype(int)
df['Param2'] = (df.eq(1) & shift.eq(1)).sum(1).astype(int)
df['Param3'] = (df.eq(0) & shift.eq(1)).sum(1).astype(int)

输出:

   A  B  C  D  Param1  Param2  Param3
0  0  1  0  0       0       0       0
1  1  1  1  1       3       1       0
2  0  0  1  1       0       2       2
3  0  1  0  1       1       1       1
4  1  1  0  0       1       1       1
5  1  1  1  0       1       2       0