🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

pandas

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

Q&A

解決済

2回答

1113閲覧

python3 データフレームを作成したい

tanatomo

総合スコア19

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2020/12/26 10:26

編集2020/12/26 15:30

こんにちは
リストからデータフレームを作成したいと思っています。
うまく行かない理由がわからないため困っています。
やり方をご教示頂けませんでしょうか。
何卒よろしくお願いいたします。

▮やりたいこと
以下のようなデータフレームを作成したいです。
イメージ説明

▮リストとコード
手元には以下のリストがあり、
コードを記述したのですが「▮結果」のようになってしまいます。
※項目名が1行づつしか反映されない
/
list1=[['A'], ['B'], ['C']]

list2=[['2020年11月28日(土)', '2020年11月27日(金)', '2020年11月26日(木)', '2020年11月25日(水)'], ['2020年08月15日(土)', '2020年08月14日(金)', '2020年08月13日(木)', '2020年08月12日(水)', '2020年08月11日(火)', '2020年08月10日(月)', '2020年08月09日(日)'], ['2020年08月16日(日)']]

list3=[['10:00'], ['10:00'], ['10:00'], ['11:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['13:00']]

list4=[['17:00'], ['18:00'], ['18:00'], ['18:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['21:00']]

list5=[['受付中', '締切済み', '締切済み', '締切済み'], ['締切済み', '締切済み', '締切済み', '締切済み', '締切済み', '締切済み', '締切済み'], ['締切済み']]

import pandas as pd

dfm = pd.DataFrame()
for i in range(len(list2)):
df = pd.DataFrame([[w,x,y,z] for w,x,y,z in zip(list2[i],list3[i],list4[i],list5[i])])
df.insert(0,'', list1[i][0])
dfm = pd.concat([dfm, df])

dfm.columns = ['項目名','開催日','開始時間','終了時間','状況']
print(dfm)
/

▮結果
イメージ説明

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

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

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

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

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

guest

回答2

0

元の作り方とは全然違いますが、こんなやり方もあります。

python

1import pandas as pd 2 3list1=[['A'], ['B'], ['C']] 4 5list2=[['2020年11月28日(土)', '2020年11月27日(金)', '2020年11月26日(木)', '2020年11月25日(水)'], ['2020年08月15日(土)', '2020年08月14日(金)', '2020年08月13日(木)', '2020年08月12日(水)', '2020年08月11日(火)', '2020年08月10日(月)', '2020年08月09日(日)'], ['2020年08月16日(日)']] 6 7list3=[['10:00'], ['10:00'], ['10:00'], ['11:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['13:00']] 8 9list4=[['17:00'], ['18:00'], ['18:00'], ['18:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['21:00']] 10 11list5=[['受付中', '締切済み', '締切済み', '締切済み'], ['締切済み', '締切済み', '締切済み', '締切済み', '締切済み', '締切済み', '締切済み'], ['締切済み']] 12 13list1_ = [list1[i]*len(list2[i]) for i in range(len(list1))] 14 15list1_ = [] 16list2_ = [] 17list5_ = [] 18for item, days, status in zip(list1, list2, list5): 19 list1_ += item*len(days) 20 list2_ += days 21 list5_ += status 22 23list3_ = [s[0] for s in list3] 24list4_ = [e[0] for e in list4] 25dfm = pd.DataFrame([list1_, list2_, list3_, list4_, list5_]).T 26dfm.columns = ['項目名','開催日','開始時間','終了時間','状況'] 27print(dfm) 28

投稿2020/12/26 12:10

ppaul

総合スコア24670

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

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

tanatomo

2020/12/26 15:28

ありがとうございます!こちらでやると、もともと目指していた出力の順番になるんですね。勉強させて頂きました!
guest

0

ベストアンサー

修正しました

list2, list5 の配列の形状が特殊なので、list3 list4 とは別に処理した方がよさそうです。

雑に直してみたサンプルは以下のような形です。

python

1list1=[ 2 ['A'], ['B'], ['C'] 3] 4list2=[ 5 [ 6 '2020年11月28日(土)', 7 '2020年11月27日(金)', 8 '2020年11月26日(木)', 9 '2020年11月25日(水)' 10 ], [ 11 '2020年08月15日(土)', 12 '2020年08月14日(金)', 13 '2020年08月13日(木)', 14 '2020年08月12日(水)', 15 '2020年08月11日(火)', 16 '2020年08月10日(月)', 17 '2020年08月09日(日)' 18 ], [ 19 '2020年08月16日(日)' 20 ] 21] 22list3=[ 23 ['10:00'], ['10:00'], ['10:00'], ['11:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['07:00'], ['13:00'] 24] 25list4=[ 26 ['17:00'], ['18:00'], ['18:00'], ['18:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['13:00'], ['21:00'] 27] 28list5=[ 29 ['受付中', '締切済み', '締切済み', '締切済み'], ['締切済み', '締切済み', '締切済み', '締切済み', '締切済み', '締切済み', '締切済み'], ['締切済み'] 30] 31 32dfm = pd.DataFrame() 33for i in range(len(list2)): 34 df = pd.DataFrame([[w, z] for w ,z in zip(list2[i], list5[i])]) 35 df.insert(0, '', list1[i][0]) 36 dfm = pd.concat([dfm, df]) 37 38dfm.columns = ['項目名', '開催日', '状況'] 39dfm['開始時間'] = list3 40dfm['終了時間'] = list4 41print(dfm)

この場合、以下の結果が得られました

項目名 開催日 状況 開始時間 終了時間 0 A 2020年11月28日(土) 受付中 [10:00] [17:00] 1 A 2020年11月27日(金) 締切済み [10:00] [18:00] 2 A 2020年11月26日(木) 締切済み [10:00] [18:00] 3 A 2020年11月25日(水) 締切済み [11:00] [18:00] 0 B 2020年08月15日(土) 締切済み [07:00] [13:00] 1 B 2020年08月14日(金) 締切済み [07:00] [13:00] 2 B 2020年08月13日(木) 締切済み [07:00] [13:00] 3 B 2020年08月12日(水) 締切済み [07:00] [13:00] 4 B 2020年08月11日(火) 締切済み [07:00] [13:00] 5 B 2020年08月10日(月) 締切済み [07:00] [13:00] 6 B 2020年08月09日(日) 締切済み [07:00] [13:00] 0 C 2020年08月16日(日) 締切済み [13:00] [21:00]

元データの形状が一致していないので、まずはそれを合わせる処理を書くのが良いのではないかと感じました。
また、list3 list4 は、配列の中に要素が一つしかない配列が入っていますが、可能であれば、内側の配列は、単なる1つの文字列にした方が結果がきれいにしやすそうです。


というのと、質問文内のソースコードの上下にバックスラッシュをつけて、インデントが反映されるようにしておきましょう

投稿2020/12/26 11:03

編集2020/12/26 11:26
siruku6

総合スコア1382

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

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

tanatomo

2020/12/26 11:34

ありがとうございます!なるほど、list3,list4を後から足すとうまく行くんですね。勉強になりました!
siruku6

2020/12/26 11:36

はい。 >list2, list5 の配列の形状が特殊なので、list3 list4 とは別に処理した方がよさそうです。 データの形状をよく見ておきましょう... list2とlist5はよく似ていますが、その二つと3,4は違うことがわかるかと思います!
hentaiman

2020/12/26 11:39

> なるほど、list3,list4を後から足すとうまく行くんですね。勉強になりました! むしろlistの深さを事前に合わせられないかを検討するのが先かと
siruku6

2020/12/26 11:51

> hentaimanさん > むしろlistの深さを事前に合わせられないかを検討するのが先かと できるならそうした方がいいと、私も思います....。
tanatomo

2020/12/26 15:42

ありがとうございます。各listはスクレイピングしたもの(の見た目を変えただけのもの)なのですが、そこで言うと仰っているのはおそらくスクレイピングの際に「listの深さが合う」ように工夫するという意味ですね。かしこまりました、勉強させて頂きます。
hentaiman

2020/12/26 15:48

絶対の方法は無いので好きな方法で良いとは思いますよ 楽な方法を優先するというだけの事です 自分なら他の回答にあるようにzipを使えるように調整しますが、その調整がものすごく手間なら他の方法を模索します。 なので「検討」です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問