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

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

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

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

Python

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

Q&A

解決済

1回答

1889閲覧

Python 複数のリストをまとめて処理したい

SuzuAya

総合スコア71

Python 3.x

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

Python

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

1グッド

0クリップ

投稿2020/04/28 12:43

前提・実現したいこと

Pythonを使って、2つのリストをまとめて処理したいのですがエラーが出てうまく動かすことができていません。
具体的には、以下のようなことをしたいのですが、どなたかアドバイスをくださらないでしょうか。
・あるcsvファイルの'day_start_from_0120'が52以上68未満のデータをdf_test_1とする。
・あるcsvファイルの'day_start_from_0120'が53以上69未満のデータをdf_test_2とする。
(略)
・あるcsvファイルの'day_start_from_0120'が69以上86未満のデータをdf_test_17とする。

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

KeyError Traceback (most recent call last) /usr/local/lib/python3.6/dist-packages/pandas/core/computation/scope.py in resolve(self, key, is_local) 186 if self.has_resolvers: --> 187 return self.resolvers[key] 188 24 frames KeyError: 'day' During handling of the above exception, another exception occurred: KeyError Traceback (most recent call last) KeyError: 'day' During handling of the above exception, another exception occurred: UndefinedVariableError Traceback (most recent call last) /usr/local/lib/python3.6/dist-packages/pandas/core/computation/scope.py in resolve(self, key, is_local) 201 from pandas.core.computation.ops import UndefinedVariableError 202 --> 203 raise UndefinedVariableError(key, is_local) 204 205 def swapkey(self, old_key: str, new_key: str, new_value=None): UndefinedVariableError: name 'day' is not defined

該当のソースコード

Python

1import pandas as pd 2 3df = pd.read_csv("data.csv") 4 5lists = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] 6days = [52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85] 7for(list, day) in zip (lists, days): 8 df_test[list] = df.query('day <= day_start_from_0120 < day+16')

補足情報(FW/ツールのバージョンなど)

リストを作って処理すればうまくいくのでは?と考えただけであって、やり方にこだわりはありません。
他のやり方でも全く構いませんので、こうしたら良いのではというアドバイスがありましたら教えていただけるととても助かります!

DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

pandas.DataFrameの行を条件で抽出するquery

query()メソッドの条件文字列の中で変数を使用するには変数名の前に@をつける。

Python

1df.query('point > @val')

複数条件を指定する場合はquery()メソッドだと以下のように書ける。

Python

1df.query('age < 25 & point > 65')

【追記】
簡単なdfで試してみました。

Python

1print(df) 2# day_start_from_0120 3#0 52 4#1 52 5#2 60 6#3 65 7#4 5 8#5 3000 9 10df_test = {} 11 12lists = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] 13days = [52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85] 14for(list, day) in zip (lists, days): 15 df_test[list] = df.query('@day <= day_start_from_0120 < @day+16') 16 print(list, day) 17 18print(df_test[1]) 19# day_start_from_0120 20#0 52 21#1 52 22#2 60 23#3 65

投稿2020/04/28 13:28

編集2020/04/29 09:55
meg_

総合スコア10580

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

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

SuzuAya

2020/04/28 22:51

>meg_様 いつもためになるアドバイスを本当にありがとうございます! いただいたアドバイスを基に以下の通りとしてみたところ「ValueError: Wrong number of items passed 198, placement implies 1」というエラーが出てしまいました。 lists = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] days = [52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85] df_test= df.copy() for(list, day) in zip (lists, days): df_test[list] = df.query('@day <= day_start_from_0120 < @day+16')
meg_

2020/04/29 01:12

queryで複数条件を指定する場合は各条件を「&」で繋いでください。(A< X <B のような書き方はNGです)
SuzuAya

2020/04/29 09:14

>meg_様 追加のご回答ありがとうございます! A,Bが数値の時は、A< X <Bのような書き方でも上手くいっていたのですが、上記のケースだとうまくいかなくなってしまいました。 @をつけて、各条件を「&」で繋いでみたのですが、「198 implies 1」というようなエラーが出てしまいました。。 今回はあきらめて手作業で1つずつ更新し、今後のためにfor文を勉強したいと思います!! いつも本当にありがとうございます。
meg_

2020/04/29 09:39

質問のコードを試したところ「NameError: name 'df_test' is not defined」のエラーが出てしまいました。df_testって何ですか??(使い方から見ると辞書ですか?)
meg_

2020/04/29 09:43

df_testを辞書と仮定してコードを動かしたところ動きました! "df.query('@day <= day_start_from_0120 < @day+16')"のままで動きました。失礼しました。
SuzuAya

2020/04/29 10:47

>meg_様 何度もお時間を使ってくださり、本当に感謝です…! いつも初心者の質問に根気強くお付き合いくださりありがとうございます。
meg_

2020/04/29 10:55

1点だけ気になったので。zip (lists, days)ですと、各リストから17個の要素までしか取得できませんがそれで良いのですよね?(要素数の短いリストの長さに合わせるため)
SuzuAya

2020/04/29 11:48

>meg_様 はい、ご理解の通りで大丈夫です! 私がzipの性質をよく理解しておらず、長さの違う要素を入れてしまっておりました><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問