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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

pandas

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

Q&A

解決済

2回答

2109閲覧

区切り文字のあるListデータからpandasの列毎に区切られたDataFrameへの変換がうまく出来ません。

FM_TOWNS

総合スコア59

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

pandas

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

0グッド

0クリップ

投稿2022/01/17 06:11

今回、初めての質問です。Markdown記述含め、要を得ませんが、何卒よろしくお願いします。

Jupyter Notebookで勉強中です。

以下のリストファイルがあります。
名称は、outputとしています。
このリスト(カンマ区切り有り)のpandasのDataFrameへの取り込みで区切った上で、DataFrameの各コラムとしたいのですが、進まず、今回質問させていただいているところです。

事前のインポートライブラリは以下の通りです。

引用テキスト

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import string

  • リスト

0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
1 [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
2 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
3 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...

データタイプは、print(type(output))とすると、
<class 'pandas.core.series.Series'>
と返されてきます。

上記リストに対し、
<コード>
In
df_amenities=pd.DataFrame(output,columns=["sign"])
Out
df_amenities
sign
0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
1 [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
2 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
3 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
となり、これに対し、column[sign]でカンマ(,)により区切りされるよう、
In
df_amenities["sign"]=df_amenities["sign"].str.split(",", expand=True)
としたところ、エラーなく処理はされたものの、
Out
df_amenities
sign
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
となり、全てデータなし状態になってしまいました。

当方としては、最終的には、pandasのDataFrameとなり、以下のイメージのようなものが出来ることろを期待しています。
イメージ説明
※0,1の数字展開自体は、あくまで例示です。

なお、columnのラベルは、最終的には、固有名詞(具体的には、不動産の設備名)に置き換える予定です。
横方向は、各不動産で、要は各不動産毎の設備を0or1で把握したい、というものです。
区切りされる0or1のデータ数は、columnのラベル数と一致する筈です。

各不動産毎の設備有無を0,1化したdataframeの完成を目指しています。

全くの初心者で、要を得ないところばかりですが、ご教授をいただけますと、大変ありがたいです。

よろしくお願いします。

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

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

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

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

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

melian

2022/01/17 06:36

output の型は pandas.core.series.Series とのことですが、何か元になるファイルがあって、それを読み込んで output を作成したのでしょうか? その部分の処理が判れば、直接データフレームに変換できるかもしれません。
FM_TOWNS

2022/01/19 02:37

追記、ありがとうございます。 今回、初めての質問で、この追記・質問欄の使い方も十分に理解できていないと思いますが、不手際がありましたら、ご容赦願います。 outputは、ご推察の通りです。いろいろな設備(駐車場、Wifi等々)がcolumn内に["駐車場","Wifi",…]と物件毎(行毎)に並んだDataFrameがあり、これに対し、0,1化を行い、こういう設備の有無が賃貸契約に結びつきやすいか等の回帰分析に使いたい、というところです。 これら設備は、要らない文字の削除、空白の詰め等を行い、listにしました。 当リストは、print(type(f_list))とすると、<class 'list'>と返されています。 いただいた質問に対し、誠に恐縮ですが、sign0~のcolumn名をf_listに置き換えたく、以下を組みました。 df_amenities2.set_axis([amn_list]).axis='columns' df_amenities2はいただいた構文でsign0~のcolumn名を付り直し、0,1の区切りを取って展開したDataFrameです。 結果は、 Length mismatch: Expected axis has 76619 elements, new values have 476 elements というエラーになりました。 listはprint(len(f_list))で476が返されおり、df_amenities2も76619 rows × 476 columnsという返しになっています。 column数としては合っている、と思ったのですが、当方の力量では、これ以上は対処が思いつきません。 まことに恐縮しておりますが、ご教示いたたけますと幸いです。
guest

回答2

0

python

1df_amenities = pd.DataFrame(i for i in output).rename(columns=lambda x: f'sign{x}') 2 3print(df_amenities) 4 5# 6 sign0 sign1 sign2 sign3 sign4 sign5 ... sign9 sign10 sign11 sign12 sign13 sign14 70 0 0 0 0 0 0 ... 0 0 1 0 0 0 81 0 0 0 0 0 1 ... 0 0 1 0 0 0 92 0 0 0 0 0 0 ... 0 0 1 0 0 0 103 0 0 0 0 0 0 ... 0 0 1 0 0 0 114 0 0 0 0 0 0 ... 0 0 0 0 0 0

投稿2022/01/17 07:02

melian

総合スコア19761

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

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

FM_TOWNS

2022/01/19 02:15

ご回答ありがとうございます。出張でレスが遅れ、申し訳ございませんでした。 上手く稼働するようになりました。 今回、初めての利用でしたが、当方の拙い説明に対し、迅速、正確なご回答をいただき、正直、大変感動しています。 forループ、lambdaの使い方は、理解出来ていませんが、何度か経験、今回のようなアドバイスを基に経験値を上げていくしかないかと思っています。 厚かましい限りですが、lambda内の f'signはpandasなり、paython所与の関数名なのでしょうか?f'自体に意味があるのかもしれず…、f'○○{x}とすると、○○xという文字が生成される、というものでしょうか? ご教示いただけますと幸いです。
melian

2022/01/19 02:19

はい、「f'○○{x}とすると、○○xという文字が生成される」という意味になりまして、f-strings といいます。これは、 'sign{}'.format(x) と同じことになります。
FM_TOWNS

2022/01/19 02:43

クイックなご回答、ありがとうございます。 恥ずかしい限りですが、こういうのは、正規表現というのでしょうか? どういうタイトルの資料を見れば、今後の参考になるかと思いまして…、ご教示いただけますと幸いです。 お手数をお掛けします。
melian

2022/01/19 03:16

正規表現とは異なります。以下の資料を読んでみて下さい。 Pythonのf文字列(フォーマット済み文字列リテラル)の使い方 https://note.nkmk.me/python-f-strings/
FM_TOWNS

2022/01/19 07:08

当方のプリミティブな質問に対し、早々のご案内、ありがとうございます。 拝見、今回の仕様部分を確認出来ました。 ありがとうございました。
guest

0

ベストアンサー

以下です。

python

1>>> print(output) 20 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 31 [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0] 42 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 53 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 64 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 7dtype: object 8>>> df_amenities = pd.DataFrame(output.to_list()) 9>>> df_amenities.columns = [f'sign{i}' for i in range(len(df_amenities.columns))] 10>>> print(df_amenities) 11 sign0 sign1 sign2 sign3 sign4 sign5 sign6 sign7 sign8 sign9 sign10 sign11 sign12 sign13 sign14 120 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 131 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 142 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 153 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

投稿2022/01/17 06:41

ppaul

総合スコア24666

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

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

FM_TOWNS

2022/01/19 03:10

出張で返答が遅くなり、申し訳ございません。 仰せの方法で組んでみたところ、首尾よく完了しました。 df_amenities2.columns = [f'sign{i}' for i in range(len(df_amenities2.columns))] で、f'sign{i}'とfor i in range(len(df_amenities2.columns))]は私には全く思いつきませんでした。for文、記号f'等で不案内なところばかりですが、いろいろと経験と学習を積んでいくしかないと思っています。 前述の構文は、リストからcolumn名を変更する際も使え、ありがとうございました。 今回、当方の拙い質問に対し、迅速且つ的確なアドバイスをいただき、大変、有り難く思っています。 また、何かの機会がありましたら、よろしくお願いします。
FM_TOWNS

2022/01/19 14:43

まことに恐縮ですが、よく理解できておりませんでした。 df_amenities = pd.DataFrame(output.to_list()) より、実際にご回答のような区切りされたDataFrameが返されてくるのですが、to_list()はpd.DataFrameの引数として、リストからDataFrameにするものとして定義されているものでしょうか? 名前からは、反対のイメージを受けましたが、そういうもの、というところをご教示いただけますと幸いです。 また、 list=[['田中一郎', '男', 50, '会社員'], ['佐藤花子', '女', 45, '弁護士'], ['高橋太郎', '男', 30, '医師'], ['橋本清', '男', 41, '自営業']] というリストからDataFrameを作ってみましたが、 df_2= pd.DataFrame(list) →DataFrameは作成 df_2= pd.DataFrame(list.to_list())→エラー: 'list' object has no attribute 'to_list' となります。 当方が当初お伺いした0,1リストのDataFrame化と、前記の文字リストのDataFrame化で、to_list()はどういう場合は必要か、ご教示いただけますと大変有り難く思います。 理解悪く恐縮ですが、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問