группировать строки в упорядоченном кадре данных панд в зависимости от значений столбца - PullRequest
0 голосов
/ 12 октября 2018

У меня есть вопрос о группировании только определенных строк в кадре данных pandas (который упорядочен по метке времени), в зависимости от значений их столбцов.

Так вот пример:

df=pd.DataFrame({"text":["Hello.",
                    "I had a question.", 
                    "Hi!",
                    "Yes how can I help?",
                    "Do you ship to the UK?"
                    ],
            "timestamp":[
                        pd.Timestamp('20131213 11:50:00'),
                        pd.Timestamp('20131213 11:51:00'),
                        pd.Timestamp('20131213 11:52:00'),
                        pd.Timestamp('20131213 11:53:00'),
                        pd.Timestamp('20131213 11:54:00')
                        ],
            "direction":["In","In","Out","Out","In"]})

Вот как выглядит фрейм данных:

enter image description here

Этот фрейм данных упорядочен по метке времени и может быть (например) веткой чата, где направление «В» может говорить один человек, а «Вне» - другой человек говорит.

То, что я хотел бы получить, это что-то вродеэто: enter image description here

В последнем кадре данных текст строк сгруппирован в одну строку, если они имеют одинаковое направление, но строки сгруппированы только до достижениягрести в другом направлении.И порядок сообщений сохраняется.

У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Настройка

operations = {
    'text': ' '.join,
    'direction': 'first',
}

Использование agg и общий трюк для группировки по последовательным значениям:

df.groupby(df.direction.ne(df.direction.shift()).cumsum()).agg(operations)

                               text direction
direction
1          Hello. I had a question.        In
2           Hi! Yes how can I help?       Out
3            Do you ship to the UK?        In
0 голосов
/ 12 октября 2018

Как насчет того, чтобы сделать что-то вроде этого:

# indicate direction changes
df['dir'] = df.direction.shift(1).bfill()
df['dir_change'] = df.apply(lambda x: 1 if x.direction != x.dir else 0, axis=1)

# create new groups
df['new_group'] = df.dir_change.cumsum()

# group on new groups and aggregate the text
agg_df = df.groupby('new_group').agg({'text':lambda x: ' '.join(list(x)), 'timestamp':'first'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...