#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