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

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

新規登録して質問してみよう
ただいま回答率
85.35%
pandas

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

Q&A

解決済

1回答

1475閲覧

pandasで重複する行を結合、その後重複したvalue(文字列)をカラムごとに分割

Zhiye

総合スコア7

pandas

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

0グッド

0クリップ

投稿2020/09/06 01:28

編集2020/09/06 04:37

8/30に本件を質問し、can110さんにご回答頂きました。(下記URL:質問及びご回答内容)

https://teratail.com/questions/288496

前回質問した際は、'material'が'a','b','c'・・・の単純な文字列を使ってしまいました。
実際処理しているデータは、下記のような文字列です。

df_before = pd.DataFrame({'code' : [1,1,1,2,2,3,4,5], 'material' : ['東京','千葉','神奈川','埼玉','山梨','東京','千葉','神奈川']}) # code material # 0 1 東京 # 1 1 千葉 # 2 1 神奈川 # 3 2 埼玉 # 4 2 山梨 # 5 3 東京 # 6 4 千葉 # 7 5 神奈川

'code'をgroupbyで集計しつつ、'material'はvalueで重複したものを別のカラムに分割したいと考えています。
解決方法として、materialのvalueで重複するものを一旦“_”でつなぎ、

df_before_01 = df_before.groupby('code')['material'].apply(lambda x: '_'.join(sorted(list(x)))).reset_index() # code material # 0 1 千葉_東京_神奈川 # 1 2 埼玉_山梨 # 2 3 東京 # 3 4 千葉 # 4 5 神奈川

その後重複するvalueに応じてcolumnを設定し、下記のような結果を導き出したいと考えています。

# code material material_1 material_2 # 0 1 東京 千葉 神奈川 # 1 2 埼玉 山梨 None # 2 3 東京 None None # 3 4 千葉 None None # 4 5 神奈川 None None

重複するvalueに応じてcolumnを設定することは前回ご教示頂きました。

a = df_before_01['material'].apply(lambda x:list(x)).tolist() n_col = max([len(l) for l in a]) df = pd.DataFrame( a, columns=[f'mat{i+1}' for i in range(n_col)]) df.insert(0,'code', df_before_01['code'])

上記ご教示頂いたものを参考に、lambda x:list(x)の部分について、“_”まででリストを作るようコードを書けばよいかと思うのですが、おそらく正規表現で書くとは思うのですがどうしても書くことができません。

あと、私見として、“”だけのcolumnが発生するため、このcolumnを削除すればよいのではと考えていますが、
うまくコードを書くことができません。おそらく、drop(),axis=1を使うとは思うのですが、申し訳ないです。
また、そもそも、“
”で文字列を分けずにできる方法もありましたら是非ご教示いただけますと幸いです。

環境
Python 3.7 :: Anaconda custom (64-bit)
pandas 1.05

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

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

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

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

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

Zhiye

2020/09/06 04:40

丸投げの質問と受け止められたこと、誠に申し訳ありません。 色々試してみたのですが、うまくコードを書くことができず投稿させて頂きました。 コードをもう少し書けるように現在勉強中ですので、何卒ご支援のほど宜しくお願い致します。 一部質問内容の編集を行いました。おそらく、これを使うであろう関数等を追記させて頂きました。
guest

回答1

0

ベストアンサー

「文字列としてひとつにまとめる」ことにこだわる必要はないのでは。
前回の質問では、materialがすべて1文字だったので、sumやlistで結合・分解が楽だったから文字列化しただけじゃないかな。

以下のコードでは、codeでgroubyしたmaterialの内容を取り出してリストにしたpd.Seriesを作り、それを使って、目的のDataFrameを生成しています。

Python

1import pandas as pd 2 3df_before = pd.DataFrame({'code': [1, 1, 1, 2, 2, 3, 4, 5], 4 'material': ['東京', '千葉', '神奈川', '埼玉', '山梨', '東京', '千葉', '神奈川']}) 5# print(df_before) 6 7s = df_before.groupby('code')['material'].apply(list) 8# print(s) 9 10df = pd.DataFrame(s.tolist()) 11df.rename(columns=lambda x: f"material{x + 1}", inplace=True) 12df.insert(0, 'code', s.index) 13print(df)

result

1 code material1 material2 material3 20 1 東京 千葉 神奈川 31 2 埼玉 山梨 None 42 3 東京 None None 53 4 千葉 None None 64 5 神奈川 None None

投稿2020/09/06 05:07

編集2020/09/06 05:09
Daregada

総合スコア11990

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

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

Zhiye

2020/09/06 07:54

アプローチがそもそも間違っていました。非常にシンプルに考えて頂き大変勉強になりました。 現状コードについてはまだ勉強が足りず基本的なことで行き詰ってしまい、teratailで質問しておりますが、質問が丸投げに受け止められている状況です。 質問が丸投げにならないよう、行き詰ったところまでコードで示せるように尽力いたします。 大変助かりました。重ねてにはなりますがお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問