python - Как объединить последовательные строки без потери порядка записей в pandas? - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь объединить две строки на основе категориальной переменной, когда категории переменной в последовательных строках совпадают. Вот мои данные ниже, например:

   SNo  user    Text
0   1   Sam     Hello
1   1   John    Hi
2   1   Sam     How are you?
3   1   John    I am good
4   1   John    How about you?
5   1   John    How is it going?
6   1   Sam     Its going good
7   1   Sam     Thanks
8   2   Mary    Howdy?
9   2   Jake    Hey!!
10  2   Jake    What a surprise
11  2   Mary    Good to see you here :)
12  2   Jake    Ha ha. Hectic life
13  2   Mary    I know right..
14  2   Mary    How's Amy doing?
15  2   Mary    How are the kids?
16  2   Jake    All is good! :)

Здесь, если мое предыдущее значение столбца user совпадает с моим текущим значением столбца user, но отличается от следующего значения в этом столбце, то Я бы конкатенировал значения из столбца Text для этого пользователя. Мне нужно сделать это, пока больше не будет многократного вхождения этого конкретного пользователя. Пример вывода приведен ниже:

SNo user    Text
1   Sam     Hello
1   John    Hi
1   Sam     How are you?
1   John    I am good-How about you?-How is it going?
1   Sam     Its going good-Thanks
2   Mary    Howdy?
2   Jake    Hey!!-What a surprise
2   Mary    Good to see you here :)
2   Jake    Ha ha. Hectic life
2   Mary    I know right..-How's Amy doing?-How are the kids?
2   Jake    All is good! :)

Я пытался использовать df.groupby(), а затем .agg(), чтобы выполнить конкатенацию, но не смог применить вышеупомянутое условие над ним. Следовательно, вывод объединяет все вхождения пользователя в чат.

df = sample_data.groupby(["SNo","user"]).agg({'Text': '-'.join}).reset_index() # incorrect though
df

Более того, я стараюсь избегать for l oop, как чума, и пробую векторизованное решение.


Пример данных:

data_dict = {'S. No.': [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2], 'user': ['Sam', 'John', 'Sam', 'John', 'John', 'John', 'Sam', 'Sam', 'Mary', 'Jake', 'Jake', 'Mary', 'Jake ', 'Mary', 'Mary', 'Mary', 'Jake'], 'Text': ['Hello', 'Hi', 'How are you?', 'I am good', 'How about you?', 'How is it going?', 'Its going good', 'Thanks', 'Howdy?', 'Hey!!', 'What a surprise', 'Good to see you here :)', 'Ha ha. Hectic life', 'I know right..', "How's Amy doing?", 'How are the kids?', 'All is good! :)']}

sample_data = pd.DataFrame(data_dict)

1 Ответ

5 голосов
/ 10 апреля 2020

Вы хотите сравнить user с его shift и cumsum для изменений. Затем вы можете сгруппировать:

blocks = df['user'].ne(df['user'].shift()).cumsum()
(df.groupby(['SNo', blocks])
  .agg({'user':'first','Text': '-'.join})
  .reset_index('user', drop=True)
)

Выход:

     user                                               Text
SNo                                                         
1     Sam                                              Hello
1    John                                                 Hi
1     Sam                                       How are you?
1    John          I am good-How about you?-How is it going?
1     Sam                              Its going good-Thanks
2    Mary                                             Howdy?
2    Jake                              Hey!!-What a surprise
2    Mary                            Good to see you here :)
2    Jake                                 Ha ha. Hectic life
2    Mary  I know right..-How's Amy doing?-How are the kids?
2    Jake                                    All is good! :)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...