группировать фрейм данных pandas на основе внутреннего индекса столбцов

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных pandas, который представляет список предложений, когда каждая строка представляет собой слово, и он получил идентификатор, соответствующий его местоположению в предложении.
Это выглядит примерно так:

        ID        FORM 
  0    1           A   
  1    2        word   
  2    3          in   
  3    4         the   
  4    5       first   
  5    6    sentence   
  6    7           .   
  7    1         The   
  8    2      second   
  9    3    sentence   
  10   4           .   
  11   1         the   
  12   2       third   
  13   3    sentence     
        ...
 

Как я могу добавить дополнительный столбец с именем «Предложение», который будет соответствовать тому, к какому предложению принадлежит данное слово, и мой фрейм данных будет выглядеть так:

         ID        FORM  Sentence  
  0    1           A    1
  1    2        word    1
  2    3          in    1
  3    4         the    1
  4    5       first    1
  5    6    sentence    1
  6    7           .    1
  7    1         The    2
  8    2      second    2
  9    3    sentence    2
  10   4           .    2
  11   1         the    3
  12   2       third    3
  13   3    sentence    3
 

Я могу сделать это, повторив фрейм данных и создав серию вручную, но это выглядит уродливо и не очень питонически.
Есть ли хороший способ использовать pandas, чтобы сделать это для меня?

Комментарии:

1. Можно ли использовать apply в pandas для u?

Ответ №1:

попробуйте это

 df['Sentence']=(df['ID'].diff()<0).cumsum()
df
 

создает

      ID  FORM        Sentence
--  ----  --------  ----------
 0     1  A                  0
 1     2  word               0
 2     3  in                 0
 3     4  the                0
 4     5  first              0
 5     6  sentence           0
 6     7  .                  0
 7     1  The                1
 8     2  second             1
 9     3  sentence           1
10     4  .                  1
11     1  the                2
12     2  third              2
13     3  sentence           2
 

Вот (df['ID'].diff()<0) логический массив, который имеет значение True при ID уменьшении. .cumsum() увеличивается на 1 каждый раз, когда это происходит

Ответ №2:

Давайте попробуем shift с cumsum

 df['st']=df['FORM'].eq('.').shift().cumsum().fillna(0) 1
df
Out[385]: 
    ID      FORM   st
0    1         A  1.0
1    2      word  1.0
2    3        in  1.0
3    4       the  1.0
4    5     first  1.0
5    6  sentence  1.0
6    7         .  1.0
7    1       The  2.0
8    2    second  2.0
9    3  sentence  2.0
10   4         .  2.0
11   1       the  3.0
12   2     third  3.0
13   3  sentence  3.0
 

Ответ №3:

Я бы использовал ID позицию 1 вместе с cumsum , чтобы получить позиции предложений:

 df.assign(Sentence=df.ID.eq(1).cumsum())


   ID   FORM    Sentence
0   1   A           1
1   2   word        1
2   3   in          1
3   4   the         1
4   5   first       1
5   6   sentence    1
6   7   .           1
7   1   The         2
8   2   second      2
9   3   sentence    2
10  4   .           2
11  1   the         3
12  2   third       3
13  3   sentence    3