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

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

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

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

Q&A

1回答

28586閲覧

SeriesをDataFrameにしたつもりがなっていない???

Pablito

総合スコア71

Jupyter

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

0グッド

0クリップ

投稿2019/08/26 07:57

編集2019/08/26 08:04

前提・実現したいこと

アンケートベースのデータを加工しています。
色々な問題にぶつかり右往左往しているのですが、
今回は取り込んだデータのcolumnsをリスト型に変換する際に、
pd.DataFrameを使ってDataFrame型に変換したつもりでした。
そして無事実行でき、ディクショナリ型で作った新しいcolumnsを
リストを使って元のデータにappendしようとしたら
以下のエラーが起きました。

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-29-1eb9812825e1> in <module> 1 column_names = [] ----> 2 for column_no in list(data['a4'].columns.values): 3 column_names.append(name_map[column_no]) c:\users\kawamura\lib\site-packages\pandas\core\generic.py in __getattr__(self, name) 5174 or name in self._accessors 5175 ): -> 5176 return object.__getattribute__(self, name) 5177 else: 5178 if self._info_axis._can_hold_identifiers_and_holds_name(name): AttributeError: 'Series' object has no attribute 'columns'

該当のソースコード

元データ(data)

Python

1name_map = { 2 0: '~', 3 1: '~~', 4 2: '~~~', 5 3: '~~~~', 6 4: '~~~~~', 7 5: '~~~~~~', 8 6: '~~~~~~~', 9 7: '~~~~~~~~', 10 8: '~~~~~~~~~', 11 9: '~~~~~~~~~~', 12 10: '~~~~~~~~~~', 13 11: '~~~~~~~~~~~', 14 12: '~~~~~~~~~~~~', 15 13: '~~~~~~~~~~~~~', 16 14: '覚えていない' 17} 18 19data = pd.DataFrame(data) 20 21column_names = [] 22for column_no in list(data['a4'].columns.values): 23 column_names.append(name_map[column_no]) 24

随時質問の内容を分かりやすく更新していきます。
何卒宜しくお願い致します。

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

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

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

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

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

magichan

2019/08/27 01:32

tiitoiさんとのやり取りを拝見しましたが、残念ながら何をやりたくて、何が問題なのか全く理解できませんでした。(エラーの原因はtiitoiさんが提示した回答の通りかと思います。) 上記の質問に提示しているデータフレームを、どのようなリストに変換したいのでしょうか。理想とする出力結果を提示していただけたらと思います。
guest

回答1

0

この部分でエラーが起きています。

list(data['a4'].columns.values)

data が DataFrame ならば、data["a4"] は DataFrame の列 a4 を表す Series オブジェクトになります。
columns 属性があるのは、DataFrame であり、Series オブジェクトにはそのような属性はないため、エラーとなっています。

python

1import pandas as pd 2 3df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]}) 4 5print(df.columns) # Index(['A', 'B', 'C'], dtype='object') 6 7print(df["A"].columns) 8# AttributeError: 'Series' object has no attribute 'columns'

DataFrame の列をリストで取得したい場合は以下のようにすればよいです。

python

1import pandas as pd 2 3df = pd.DataFrame({"A": [1, 2, 3], 4 "B": [4, 5, 6], 5 "C": [7, 8, 9]}) 6 7print(df.columns.tolist()) # ['A', 'B', 'C']

投稿2019/08/26 08:04

編集2019/08/26 08:06
tiitoi

総合スコア21956

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

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

Pablito

2019/08/26 08:06

tiitoiさん 早速のご回答ありがとうございます。 そうするとdata['a4']ではなく、 data.columnsだといいということでしょうか??
tiitoi

2019/08/26 08:09 編集

DataFrame の列名の一覧をリストで取得したいということでしょうか? その場合、data.columns.tolist() とします。 逆に行方向の 0, 1, 2, ... の値を取得したい場合はこれは列ではなく、インデックスなので data.index となるかと思います。
Pablito

2019/08/26 08:14

ありがとうございます。 """ column_names = [] for column_no in list(data.columns.tolist()): column_names.append(name_map[column_no]) """ このように書き換えたのですが、 KeyError Traceback (most recent call last) <ipython-input-30-8655b64147b1> in <module> 1 column_names = [] 2 for column_no in list(data.columns.tolist()): ----> 3 column_names.append(name_map[column_no]) KeyError: 'cp_id' というエラーが起きました。 cp_idというのはコード上にはない、 dataのカラムの一つですが、 なぜエラーが起きるのでしょうか?
tiitoi

2019/08/26 08:27 編集

今回記載のコードでやりたいことはどのような処理なのでしょうか。 DataFrame で columns といった場合、["cp_id", "select_incentive_id", ..., "a4", "a5"] の列名になります。 print(data.columns) # ["cp_id", "select_incentive_id", ..., "a4", "a5"] この配列を for で回しているので、column_no の値は上記の "cp_id" などの文字列になります。 それに対して、name_map[column_no] としているのですが、辞書 name_map に "cp_id" などのキーは存在しないのでエラーとなっています。 1列目は '~'、2列目は '~~' などとしたい場合、len(data.columns) が列数なので、 for column_no in range(len(data.columns)): となるかと思います。
Pablito

2019/08/27 00:53 編集

column_names = [] for column_no in range(len(data.columns)): column_names.append(name_map[column_no]) すいません。 以上のように書き換えたのですが、 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-29-465e45cabb19> in <module> 1 column_names = [] 2 for column_no in range(len(data.columns)): ----> 3 column_names.append(name_map[column_no]) KeyError: 15 というエラーになってしまいました。 15というのはカラムにもディクショナリーにも 入れていないのですが なんだか分かりますか?
tiitoi

2019/08/27 03:20

ディクショナリ (name_map) にないから、エラーとなっています。 name_map は 0 ~ 14 のキーしかないため、DataFrame が16列以上あった場合、name_map にキーが存在しないため、KeyError となります。
tiitoi

2019/08/27 03:21

エラーの原因は上記の通りですが、質問のコードでどのような処理を行いたかったのかを記載していただけないと、修正案を示すことができません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問