166

Pandas の groupedby に基づいて、データフレームに複数の文字列をマージしたいと考えています。

これまでの私のコードは次のとおりです。

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)

最終結果を次のようにしたい:

ここに画像の説明を入力

groupby を使用して、「テキスト」列の文字列を連結する方法がわかりません。どんな助けでも大歓迎です!

4

7 に答える 7

267

'name'および列でグループ化してから、元の df に揃えられたデータを返す which を'month'呼び出し、テキスト エントリtransformにラムダを適用できます。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
于 2014-12-04T15:54:19.520 に答える
88

「name」列と「month」列でグループ化し、Panda の DataFrame オブジェクトの関数を呼び出すことができます。agg()

関数によって提供される集計機能により、agg()1 回の計算でグループごとに複数の統計を計算できます。

df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})

ここに画像の説明を入力

于 2019-12-11T10:48:40.930 に答える
12

リスト内の「テキスト」を連結したい場合:

df.groupby(['name', 'month'], as_index = False).agg({'text': list})
于 2020-11-25T14:46:15.340 に答える