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
回答1件
あなたの回答
tips
プレビュー