Как объединить частично последовательные строки в фрейме данных с помощью панд - PullRequest
0 голосов
/ 16 октября 2019

У меня есть CSV следующим образом. который разбит на несколько строк.

примерно так

Names,text,conv_id
tim,hi,1234
jon,hello,1234
jon,how,1234
jon,are you,1234
tim,hey,1234
tim,i am good,1234
pam, me too,1234
jon,great,1234
jon,hows life,1234

Поэтому я хочу объединить последовательно встречающиеся элементы в одну строку следующим образом и сделать ее более значимой

Ожидаемый результат:

Names,text,conv_id
tim,hi,1234
jon,hello how are you,1234
tim,hey i am good,1234
pam, me too,1234
jon,great hows life,1234

Я попробовал пару вещей, но потерпел неудачу и не смог, может кто-нибудь подсказать мне, как это сделать?

Заранее спасибо.

1 Ответ

3 голосов
/ 16 октября 2019

Вы можете использовать Series.shift + Series.cumsum, чтобы иметь возможность создавать соответствующие группы через groupby, а затем использовать join applyк каждой группе, используя groupby.apply. 'conv_id', добавляется 'Names' к группам, чтобы их можно было извлечь с помощью Series.reset_index. Наконец, DataFrame.reindex используется для размещения столбцов в начальном порядке

groups=df['Names'].rename('groups').ne(df['Names'].shift()).cumsum()
new_df=( df.groupby([groups,'conv_id','Names'])['text']
        .apply(lambda x: ','.join(x))
        .reset_index(level=['Names','conv_id'])
        .reindex(columns=df.columns) )

print(new_df)

  Names               text  conv_id
1   tim                 hi     1234
2   jon  hello,how,are you     1234
3   tim      hey,i am good     1234
4   pam             me too     1234
5   jon    great,hows life     1234

Деталь:

print(groups)

0    1
1    2
2    2
3    2
4    3
5    3
6    4
7    5
8    5
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...