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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2799閲覧

python のdataframeで、配列を複数行に展開したい

kemupeach

総合スコア13

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/08/12 08:13

初心者です。
アクセスログ分析をしているのですが、行き詰まってしまいました。
どなたか、ご教示いただけますと幸いです。
よろしくお願いいたします。

やりたいこと

pythonのdataframeで、配列になっているものを複数行に展開したいです。
できれば、指定した列は配列が分解されて複数行になり、指定しなかった列は同値が複数行に展開されるようにしたいです。

具体的には、
SQLでいう、以下のような動作をしたいです。
https://qiita.com/bwtakacy/items/b803dc5f3b44a3205832https://qiita.com/bwtakacy/items/b803dc5f3b44a3205832

やりたいこと:
以下のようなデータを

user_idpathcv_flag
A["1,3,4,5"]1
B["2,3,4,"]0

こうしたいです!

user_idpathcv_flag
A11
A31
A41
A51
B20
B30
B40

どなたか、関数だけでもいいのでご教示いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

apply(pd.Series) にてリストをSeriesに変換し、unstack() にて列データに変換できるかと思います。

Python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'user_id':['A','B'], 5 'path':[[1,3,4,5],[2,3,4]], 6 'cv_flag':[1,2] 7}) 8 9tmp_df = df.set_index('user_id')['path'].apply(pd.Series).unstack().reset_index(1).rename(columns={0:'path'}) 10res = df[['user_id','cv_flag']].merge(tmp_df, on='user_id').dropna() 11# user_id cv_flag path 12#0 A 1 1.0 13#1 A 1 3.0 14#2 A 1 4.0 15#3 A 1 5.0 16#4 B 2 2.0 17#5 B 2 3.0 18#6 B 2 4.0

投稿2018/08/12 15:27

magichan

総合スコア15898

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

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

kemupeach

2018/08/13 06:58 編集

丁寧にありがとうございます! 試してみたところ、pathのデータが以下のようなデータだっためか、展開されませんでした。 '["https://aaa/","https://aaa/ccc/","https://aaaa/bbb/"]' ご回答で説明して頂いたデータだと、以下のような形でした。 ["https://aaa/","https://aaa/ccc/","https://aaaa/bbb/"] このカラムを配列にすればいいのかと思うのですが、どのようにすればいいのでしょうか? toarray(),tolist(),df.as_matrix()など試したのですが、できませんでした。 お忙しい中お手数ですが、よろしければご教示いただけますと幸いです。
kemupeach

2018/08/13 08:20

pathのデータ型を、文字列からリストに変換できたので、 ご教示頂いたやり方でできました!! ありがとうございます!
guest

0

ベストアンサー

拾い物ですが、こんなのがありました。
“unstack” a pandas column containing lists into multiple rows

Python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame({ 5 "user_id":["A", "B"], 6 "path":[[1,3,4,5], [2,3,4]], 7 "cv_flag":[1, 0] }) 8 9df 10# user_id path cv_flag 11# 0 A [1, 3, 4, 5] 1 12# 1 B [2, 3, 4] 0 13 14lst_col = "path" 15df_new = pd.DataFrame({ 16 col:np.repeat(df[col].values, df[lst_col].str.len()) 17 for col in df.columns.difference([lst_col]) 18 }).assign(**{lst_col:np.concatenate(df[lst_col].values)})[df.c 19olumns.tolist()] 20 21df_new 22# user_id path cv_flag 23# 0 A 1 1 24# 1 A 3 1 25# 2 A 4 1 26# 3 A 5 1 27# 4 B 2 0 28# 5 B 3 0 29# 6 B 4 0

投稿2018/08/12 09:26

tachikoma

総合スコア3601

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

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

kemupeach

2018/08/13 07:02

丁寧にありがとうございます! 試してみたところ、以下のようなエラーが出ました。 zero-dimensional arrays cannot be concatenated pathのデータが配列型でなかったからだと思うのですが、 正しい状態?:["https://aaa/","https://aaa/ccc/","https://aaaa/bbb/"] 私のコード :'["https://aaa/","https://aaa/ccc/","https://aaaa/bbb/"]' どのようにすればいいのでしょうか? toarray(),tolist(),df.as_matrix()など試したのですが、できませんでした。 お忙しい中お手数ですが、よろしければご教示いただけますと幸いです。
tachikoma

2018/08/13 07:14

リストではなく文字列なんですね。 df["path"] = df["path"].apply(lambda x:eval(x)) これでリストに戻せると思うのですが、どうでしょうか。
kemupeach

2018/08/13 08:18

迅速なご回答ありがとうございます! できました!!!! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問