Соедините строки пробелом, используя функцию агрегирования панд - PullRequest
2 голосов
/ 31 мая 2019

У меня есть CSV-файл, который содержит строки с некоторыми похожими идентификаторами. Я нашел хороший подход к этому с помощью dataframe, и я нашел код, делающий это из этого поста.

Пример файла CSv:

    id               messages
0   11  I am not driving home
1   11      Please pick me up
2   11     I don't have money
3  103   The car already park
4  103     No need for ticket
5  104       I will buy a car
6  104       I will buy a car

Желаемый вывод:

Пример файла CSv:

id   messages        
011   I am not driving home Please pick me up I don't have money     
103   The car already park No need for ticket         
104   I will buy a car              

Теперь у меня есть код:

aggregation_functions = {'message':'sum'}
df_new = df.groupby(df['id']).aggregate(aggregation_functions)

Теперь, что я получаю с этим кодом:

id   messages        
011   I am not driving homePlease pick me upI don't have money      
103   The car already parkNo need for ticket         
104   I will buy a car 

Я просто хочу иметь пробел между словами (например, "homePlease"> "home Please") и избегать избыточности, например, иметь два раза I will buy a car.

Я уже проверил почту 2 , но не смог найти ответ.

Также мне нужно использовать .reindex(columns=df.columns) после aggregate(aggregation_functions)

Как:

df_new = df.groupby(df['id']).aggregate(aggregation_functions).reindex(columns=df.columns)

Ответы [ 3 ]

2 голосов
/ 31 мая 2019

Чтобы удалить избыточность, я предлагаю GroupBy.unique с последующим str.join:

df.groupby('id')['messages'].unique().str.join(' ')

В качестве альтернативы, используя GroupBy.agg с set + ' '.join:

df.groupby('id')['messages'].agg(lambda x: ' '.join(set(x)))

Оба печатают,

# id
# 11     I don't have money I am not driving home Pleas...
# 103              No need for ticket The car already park
# 104                                     I will buy a car
# Name: messages, dtype: object

Чтобы вернуть DataFrame, вызовите reset_index в конце ... например,

df.groupby('id')['messages'].unique().str.join(' ').reset_index()

#     id                                           messages
# 0   11  I am not driving home Please pick me up I don'...
# 1  103            The car already park No need for ticket
# 2  104                                   I will buy a car
2 голосов
/ 31 мая 2019

Итак, сначала будет drop_duplicates, agg join

df.drop_duplicates().groupby('id',as_index=False).messages.agg(' '.join)
2 голосов
/ 31 мая 2019

лучше использовать apply с join:

>>> df
    id               messages
0   11  I am not driving home
1   11      Please pick me up
2   11     I don't have money
3  103   The car already park
4  103     No need for ticket
5  104       I will buy a car
6  104       I will buy a car

>>> df.groupby('id')['messages'].apply(lambda x: ' '.join(x))
id
11     I am not driving home Please pick me up I don'...
103              The car already park No need for ticket
104                    I will buy a car I will buy a car
Name: messages, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...