Python - привязать предыдущую и следующую строку к текущей строке - PullRequest
0 голосов
/ 30 мая 2018

У меня есть фрейм данных Pandas:

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 Ответ

0 голосов
/ 30 мая 2018

используйте pd.DataFrame.shift для получения предыдущей / следующей строки, pd.concat для объединения кадров данных и fillna для установки нулей в ноль

Наличие нулей переводит целые числа в числа с плавающей точкой, поскольку целочисленные массивы не могут содержать нулевые значения, которые приводятся к целым числам после замены нулей на 0.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...