代码之家  ›  专栏  ›  技术社区  ›  Christopher Costello

python-cbind上一行和下一行到当前行

  •  0
  • Christopher Costello  · 技术社区  · 8 年前

    我有一个像这样的熊猫数据框:

    d = {'col1': [1, 2], 'col2': [3, 4], 'col3': [5, 6]}
    df = pd.DataFrame(data=d)
    

    看起来像:

      doc  sent col1 col2 col3
    0   0    0    5   4    8
    1   0    1    6   3    2
    2   0    2    1   2    9
    3   1    0    6   1    6
    4   1    1    5   1    5
    

    我想将前一行和下一行绑定到每一列,就像这样(在我的示例中,对“Doc”和“Sent”列进行了说明,这些列算作索引,在前面或后面什么都不能出现,如下所示):

      doc  sent col1 col2 col3 p_col1 p_col2 p_col3 n_col1 n_col2 n_col3
    0   0    0    5   4    8    0      0      0      6       3      2  
    1   0    1    6   3    2    5      4      8      1       2      9
    2   0    2    1   2    9    6      3      2      6       1      6
    3   1    0    6   1    6    0      0      0      5       1      5
    4   1    1    5   1    5    6      1      6      0       0      0
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Haleemur Ali    8 年前

    使用 pd.DataFrame.shift 要获取上一行/下一行, pd.concat 合并数据帧& fillna 将空值设置为零

    由于numpy整数数组不能包含空值,因此nulls的存在会将ints向上强制转换为float,这些值在将nulls替换为0后会被强制转换回ints。

    cs = ['col1', 'col2', 'col3']
    g = df.groupby('doc')
    
    pd.concat([
       df, 
       g[cs].shift(-1).add_prefix('n'), 
       g[cs].shift().add_prefix('p')
    ], axis=1).fillna(0).astype(int)
    

    输出:

       doc  sent  col1  col2  col3  ncol1  ncol2  ncol3  pcol1  pcol2  pcol3
    0    0     0     5     4     8      6      3      2      0      0      0
    1    0     1     6     3     2      1      2      9      5      4      8
    2    0     2     1     2     9      0      0      0      6      3      2
    3    1     0     6     1     6      5      1      5      0      0      0
    4    1     1     5     1     5      0      0      0      6      1      6