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

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

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

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

Python

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

Q&A

解決済

1回答

309閲覧

Pythonでdef関数を作成時にerrorが出る

ohmatsu420

総合スコア1

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/04/23 11:15

Pythonでpandasを利用してデータ整理を行なっておりますが、DataFrameで挙動しているはずが、途中でNonetypeに変わってしまいます。その影響だと思われますが、to.csvで書き出せない現状です。

使用デバイス・バージョン
Macbook pro
Mac OS ver.12.3.1
Python 3.8.1 64bit
pandas 1.1.3

df_1をexec()の外に出すと

AttributeError: 'NoneType' object has no attribute 'to_csv'

というエラーが返ってきます。

to.csvで書き出せなくても良いのですが、関数から導き出した結果を計算で使いたいため、returnでresultを返しても、Noneと帰ってきてしまいます。
どなたか解決方法をご教授いただけないでしょうか。

こちらが原因のコードになります。

import pandas as pd import numpy as np df_all = pd.read_csv('pass', encoding='shift-jis', sep=',', index_col=False,) def count_traffic(time_start,time_end,timezone,direction,size): #サイズの分岐 if size == "light": shashu = "小" else: shashu = "大" #向きの分岐 if direction == "up": direction_name = "上り" elif direction == "down": direction_name = "下り" else: direction_name = "上下計" time_end = time_end + 1 exec(f"{timezone}_{size}_{direction} = pd.DataFrame([])") exec(f"print({timezone}_{size}_{direction})") for time in range(time_start,time_end): exec(f"{timezone}_{size}_{direction}_{time} = list(df_all['時間交通量/{direction_name}/{shashu}型車(台) ({time}-{time+1}h)'])") exec(f"{timezone}_{size}_{direction}_{time} = pd.DataFrame({timezone}_{size}_{direction}_{time})") exec(f"{timezone}_{size}_{direction} = {timezone}_{size}_{direction}.add({timezone}_{size}_{direction}_{time},fill_value=0)") exec(f"print(type({timezone}_{size}_{direction}))") result = f"{timezone}_{size}_{direction}" print(f"{timezone}_{size}_{direction}") df_1.to_csv('pass')

error

NameError: name 'df_1' is not defined

もともとのコードは以下のものであり、こちらを関数にするとうまく挙動致しません。

import pandas as pd from pandas.core.accessor import delegate_names import numpy as np df_all = pd.read_csv('pass', encoding='shift-jis', sep=',', index_col=False,) df_ex1= df_all.copy() DAY_light_up = pd.DataFrame([]) DAY_heavy_up = pd.DataFrame([]) DAY_light_down = pd.DataFrame([]) DAY_heavy_down = pd.DataFrame([]) DAY_light_all = pd.DataFrame([]) DAY_heavy_all = pd.DataFrame([]) # DAYの総台数(7時〜18時) for time in range(7,19): exec(f"DAY_light_up_{time} = list(df_all['時間交通量/上り/小型車(台) ({time}-{time+1}h)'])") exec(f"DAY_heavy_up_{time} = list(df_all['時間交通量/上り/大型車(台) ({time}-{time+1}h)'])") exec(f"DAY_light_down_{time} = list(df_all['時間交通量/下り/小型車(台) ({time}-{time+1}h)'])") exec(f"DAY_heavy_down_{time} = list(df_all['時間交通量/下り/大型車(台) ({time}-{time+1}h)'])") exec(f"DAY_light_all_{time} = list(df_all['時間交通量/上下計/小型車(台) ({time}-{time+1}h)'])") exec(f"DAY_heavy_all_{time} = list(df_all['時間交通量/上下計/大型車(台) ({time}-{time+1}h)'])") exec(f"DAY_light_up_{time} = pd.DataFrame(DAY_light_up_{time})") exec(f"DAY_heavy_up_{time} = pd.DataFrame(DAY_heavy_up_{time})") exec(f"DAY_light_down_{time} = pd.DataFrame(DAY_light_down_{time})") exec(f"DAY_heavy_down_{time} = pd.DataFrame(DAY_heavy_down_{time})") exec(f"DAY_light_all_{time} = pd.DataFrame(DAY_light_all_{time})") exec(f"DAY_heavy_all_{time} = pd.DataFrame(DAY_heavy_all_{time})") exec(f"DAY_light_up = DAY_light_up.add(DAY_light_up_{time},fill_value=0)") exec(f"DAY_heavy_up = DAY_heavy_up.add(DAY_heavy_up_{time},fill_value=0)") exec(f"DAY_light_down = DAY_light_down.add(DAY_light_down_{time},fill_value=0)") exec(f"DAY_heavy_down = DAY_heavy_down.add(DAY_heavy_down_{time},fill_value=0)") exec(f"DAY_light_all = DAY_light_all.add(DAY_light_all_{time},fill_value=0)") exec(f"DAY_heavy_all = DAY_heavy_all.add(DAY_heavy_all_{time},fill_value=0)") print(DAY_light_up) #求めたい結果が出力されます。 #Typeは<class 'pandas.core.frame.DataFrame'>です

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/04/23 12:13

そもそも、質問文中の"原因のコード"を見ると、def count_traffic 関数がどこからも呼ばれていないように見えます。 したがって、仮に、質問文中の"原因のコード" を実行しても、「AttributeError: 'NoneType' object has no attribute 'to_csv'」エラーは発生しないはずです。 実際に実行したときに「AttributeError: 'NoneType' object has no attribute 'to_csv'」エラーを発生させているコードを、もれなく全部記載してください。 ・「df_1をexec()の外に出すと」と書いてありますが、exec()の中のどこに、df_1があるというのでしょうか? ・「原因のコード」と「もともとのコード」の関係が全く分かりません。
guest

回答1

0

ベストアンサー

{timezone}_{size}_{direction}{timezone}_{size}_{direction}_{time} をローカル変数の名前にしている様ですが、おそらく {timezone}_{size}_{direction}df_1 に対応している様に見受けられます。

処理内容は一切考慮せずに元のコードの通りに書き換えると以下の様になるかと思います(想定通りに動作するのかどうかは不明です)。

python

1def count_traffic(time_start,time_end,timezone,direction,size): 2 #サイズの分岐 3 if size == "light": 4 shashu = "小" 5 else: 6 shashu = "大" 7 8 #向きの分岐 9 if direction == "up": 10 direction_name = "上り" 11 elif direction == "down": 12 direction_name = "下り" 13 else: 14 direction_name = "上下計" 15 time_end = time_end + 1 16 df_1 = pd.DataFrame([]) 17 print(df_1) 18 19 for time in range(time_start,time_end): 20 df_time = list(df_all[f'時間交通量/{direction_name}{shashu}型車(台) ({time}-{time+1}h)']) 21 df_time = pd.DataFrame(df_time) 22 df_1 = df_1.add(df_time, fill_value=0) 23 print(type(df_1)) 24 print(df_1) 25 df_1.to_csv('pass.csv')

投稿2022/04/23 12:06

melian

総合スコア19809

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問