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

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

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

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

pandas

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

Q&A

解決済

1回答

1042閲覧

Pandasのデータフレームから変数の値で列を抜き出したいです。

amaturePy

総合スコア131

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2021/06/01 05:08

編集2021/06/01 05:53

Pandasのデータフレームに関して質問があります。
以下のコードのようにリストの要素を格納した変数でデータフレーム内の列を指定することは可能でしょうか??
format関数で試したところ、KeyErrorが出てしまいうまく行きません。
初歩的な質問だとは思うのですが、ご教授頂ければ幸いです。

やりたいこととしてはdf変数の中のデータフレームの中からpush_colの要素名の列をそれぞれ抜き出し、それらをdf0にまとめていきたいです。

col_list = df[1:1] # get first row data from dataframe push_col = [s for s in col_list if s.startswith('push') and s[-1].isdigit()] df0 = pd.DataFrame() for push in push_col:   df = df['{0}'.format(push)] df0 = pd.concat((df0,df),axis=1) print(df0)

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、formatメソッドの場所が違います。

python

1df = df['{0}'.format(push)]

また、この書き方だとdfをまるごと書き換えてしまうので、2週目以降で該当のキーがなくなって、KeyErrorになります。

解決策は実際にやりたいことによって違います。


もし、リストに入っているカラムだけ抜きだしたデータフレームを作りたいのであれば、 このようにします。 (他にもやりかたありますが)
また、元の質問についてですが、カラム名を加工したいのでなければ、変数名をそのまま指定してしまえばOKです。
変数名にpushを使っていますが、pushは関数名と被っていて、思わぬ影響がでるので使わないほうがいいでしょう。

python

1 2df0 = pd.DataFrame() 3for c in push_col: 4  df0[c] = df[c] 5 6print(df0)

ちなみに、修正後の質問のコードは動きそうですが、前にも書いたとおり、for文の中でdfに代入しているのが致命的です。dfは元のデータを保持しているので、ここでdfに代入してしまうと、元のデータが消えてしまいます。

python

1df0 = pd.DataFrame() 2for push in push_col: 3 tmp_df = df['{0}'.format(push)] 4 df0 = pd.concat((df0,tmp_df),axis=1)

こうすれば動きそうです。

また、どちらの やりかたにしても、df0の内容はdfの内容と同じものを参照しているので、この後でやりたい作業によっては、copyをしておいたほうがいいかもしれません。

python

1df0 = df0.copy()

投稿2021/06/01 05:35

編集2021/06/01 06:46
TakaiY

総合スコア12804

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

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

amaturePy

2021/06/01 05:44

ありがとうございます。format関数の位置承知しました。やりたいこととしては、上の質問欄に追加させて頂いたのですが、データフレームの中から各要素名の列データを取得して、それぞれを別のデータフレームにまとめようとしております。
amaturePy

2021/06/01 05:46

頂いたコードを試したのですが、KeyError(key)が出てしまうようです。
TakaiY

2021/06/01 06:12

for分で回して別データフレームにする場合、そのデータフレームをリストなどに格納することになりますけど、取り出すのは簡単なので、そんなことをしてもあまり意味はありません。 別のデータフレームに取り出してどうしたいのでしょう? 回答に書いたとおり、そのようになおしてもKeyErrorになります。これは、dfの中身が変ってしまうからです。
TakaiY

2021/06/01 06:28

ああ、もしかして、特定の列だけ取り出したデータフレームを作りたいのでしょうか? であればという例を回答に追加しました。
amaturePy

2021/06/01 06:28

はい。少々お伝えできるか不安ではありますが、 まず上記の処理でpush1~8dateを取得します。その各列のレコードには日付が入っております。 その各列の日付ごとに.countメソッドで総数を集計したいです。 そのために、他の雑多な列を含んでいる元のdfから今回カラム名をリスト化したものの要素名の列だけのdfを別で作ろうとしております。 つまるところ。全体のdfからpush_colに格納されてる要素名の列を全て取り出せるのが理想ではあります。
amaturePy

2021/06/01 07:12

すごく勉強になります。 すごい簡潔なコードも頂き、実装できました。ありがとうございます。 別の処理で同様の処理結果を実現していたものの無駄に複雑な工程を踏んでしまい、処理に時間がかかりすぎておりました。データフレームなかなかまだ慣れないですが、頂いたコードも参考に今後も学習していきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問