Подтвердить что ты не робот

Сжатие строк из нескольких строк с помощью Pandas groupby

Я хочу объединить несколько строк в фреймворке данных на основе группировки в Pandas.

Это мой код:

import pandas as pd
from io import StringIO

data = StringIO("""
"name1","hej","2014-11-01"
"name1","du","2014-11-02"
"name1","aj","2014-12-01"
"name1","oj","2014-12-02"
"name2","fin","2014-11-01"
"name2","katt","2014-11-02"
"name2","mycket","2014-12-01"
"name2","lite","2014-12-01"
""")

# load string as stream into dataframe
df = pd.read_csv(data,header=0, names=["name","text","date"],parse_dates=[2])

# add column with month
df["month"] = df["date"].apply(lambda x: x.month)

Я хочу, чтобы конечный результат выглядел так:

enter image description here

Я не понимаю, как я могу использовать groupby и применять некоторую конкатенацию строк в столбце "текст". Любая помощь ценится!

4b9b3361

Ответ 1

Вы можете группировать столбцы 'name' и 'month', затем вызвать transform, который будет возвращать данные, выровненные по исходному df, и применить lambda, где мы join текстовые записи:

In [119]:

df['text'] = df[['name','text','month']].groupby(['name','month'])['text'].transform(lambda x: ','.join(x))
df[['name','text','month']].drop_duplicates()
Out[119]:
    name         text  month
0  name1       hej,du     11
2  name1        aj,oj     12
4  name2     fin,katt     11
6  name2  mycket,lite     12

Я подставляю оригинальный df, передавая здесь список интересующих столбцов df[['name','text','month']], а затем вызываем drop_duplicates

EDIT Я могу просто позвонить apply, а затем reset_index:

In [124]:

df.groupby(['name','month'])['text'].apply(lambda x: ','.join(x)).reset_index()

Out[124]:
    name  month         text
0  name1     11       hej,du
1  name1     12        aj,oj
2  name2     11     fin,katt
3  name2     12  mycket,lite

Обновление

здесь lambda не требуется:

In[38]:
df.groupby(['name','month'])['text'].apply(','.join).reset_index()

Out[38]: 
    name  month         text
0  name1     11           du
1  name1     12        aj,oj
2  name2     11     fin,katt
3  name2     12  mycket,lite

Ответ 2

Ответ EdChum предоставляет вам большую гибкость, но если вы просто хотите, чтобы конкретизировать строки в столбце объектов списка, вы также можете:

output_series = df.groupby(['name','month'])['text'].apply(list)