質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

9434閲覧

DataFrameをグループ化して文字列を結合したい

frederick_1974

総合スコア303

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2019/12/26 16:39

前提・実現したいこと

PythonのPandasでデータを読み込み、特定の列の値でグループ化した上で、
別の列の文字列をカンマで区切って結合させたいと考えています。

具体的には、伝票番号ごとに単品の注文内容が列挙されているデータを、
伝票単位で注文内容を(カンマで区切って)まとめたいと考えています。

該当のソースコード

Python

1import pandas as pd 2order_df = pd.DataFrame({'伝票':['1', '1', '2', '2', '1'], 3 '注文':['ビール', '枝豆', 'ウイスキー', 'チョコ', '刺身']})

期待する結果

Python

1after_df = pd.DataFrame({'伝票':['1','2'], 2 '注文':['ビール,枝豆,刺身','ウイスキー,チョコ']})

試したこと

下記の方法では、「ビール枝豆刺身」のように、区切りがなく文字列がそのまま結合されてしまいます。

Python

1after_df = order_df.groupby('伝票').apply(lambda x: x.sum()).drop('伝票',axis=1).reset_index()

(カンマで区切るのではなく)リスト化させる方法として、下記の方法も見受けられたのですが、
「TypeError: 'DataFrameGroupBy' object is not callable」というエラーが出てしまいました。

Python

1after_df = order_df.groupby("伝票")["注文"].apply(list)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

シンプルに実装するとこんな感じになります。

Python

1df = pd.DataFrame({'伝票':['1', '1', '2', '2', '1'], 2 '注文':['ビール', '枝豆', 'ウイスキー', 'チョコ', '刺身']}) 3 4 5result = df.groupby('伝票')['注文'].apply(','.join).reset_index() 6# 伝票 注文 7#0 1 ビール,枝豆,刺身 8#1 2 ウイスキー,チョコ

投稿2019/12/26 23:15

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

frederick_1974

2019/12/27 01:10

ありがとうございます。 シンプルすぎてびっくりしたのですが、これで実現できるのですね。
guest

0

次のようにすると期待する結果になるかと思います。

python

1after_df = order_df.groupby('伝票').apply(lambda x: pd.Series({'注文': ','.join(x['注文'])})).reset_index()

投稿2019/12/26 17:42

kit494way

総合スコア317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

frederick_1974

2019/12/27 01:09

ありがとうございます。 実現できました。Seriesとしてjoinする方法があるのですね。
guest

0

pandasの上でやろうとするとかえって厄介な気がしたので、groupbyしたあとさっさとイテレータにして内包表記で整えてから再度DataFrameに変換しました。

python

1import pandas as pd 2 3order_df = pd.DataFrame({'伝票':['1', '1', '2', '2', '1'], 4 '注文':['ビール', '枝豆', 'ウイスキー', 'チョコ', '刺身']}) 5result = pd.DataFrame([[key, ",".join(value["注文"])] 6 for key, value in order_df.groupby("伝票")], 7 columns=['伝票', '注文']) 8print(result) 9""" => 10 伝票 注文 110 1 ビール,枝豆,刺身 121 2 ウイスキー,チョコ 13"""

投稿2019/12/26 17:39

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

frederick_1974

2019/12/27 01:07

ありがとうございます。 このようなやり方を考えたことがなかったので勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問