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

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

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

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

Q&A

解決済

2回答

1271閲覧

pythonでの変数やハッシュの扱いに関する質問です

yyone

総合スコア7

Python

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

0グッド

0クリップ

投稿2017/12/13 07:21

###実現したいこと
python でデータ処理をしています.
for文内でpandasのデータフレームの抽出をして,
それらを逐次異なる変数に入れたいのですが,いまいち変数の保存(定義?)がうまくいかないので教えていただきたいです.

###コードの補足
dfには予めデータが入っています.
dfから,Party Dateの年代別にデータを抽出しようとしています.
理想としては,このfor文を回した後に,df2006~df2015に抽出されたデータフレームが入っていてほしいです.
データフレームが抽出できればいいので,df[2006]などのハッシュでも大丈夫です.

###今のソースコード

python

1for i in range(2006,2015+1): 2 print("#") 3 print(i) 4 year_str = str(i) + '......' 5 df_str = 'df' + str(i) 6 df_str = df[df["Party Date"].str.contains(year_str)] 7 print(df_str)

###試してみたこと
to_csvで出力してそれをもう一度読み込む方法も考えたのですが,やっぱりfor文内で設定した変数が保存されていないので,やっぱり不明です.
今,プログラミングの勉強中ですので,原因や参照した方がよさそうなものなども教えていただけると助かります.
よろしくお願いいたします.

###エラーメッセージ
for文が終わったあと,試しにdf2006を表示してみたところ,以下のようなエラーが出てきます.

NameError Traceback (most recent call last) <ipython-input-18-74c79dd242b1> in <module>() ----> 1 df2006 NameError: name 'df2006' is not defined

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

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

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

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

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

guest

回答2

0

mkgreiさんが既に、不具合の原因と対策を解説されておりますので、私はデータを年代毎に別ける方法を書きます。

現状 DataFrame がどのような構成なのかがわからないのですが、もしかしたら**'Party Date'** Columnは文字列データなのではないでしょうか。
であれば、pandas.to_datetime() 等を使用して一度 datetime型に変換してお勧めします。
そうすることでその後の集計(年別/月別など)が大幅に楽になります。

例えば、Party Date Column が datetime型の場合、各行の年の情報を取得したい場合は、
df['Party Date'].dt.year
と簡単に記述できます。

つぎに、質問にあるコードでは ループを回して文字列比較にて年代別に別けようとしておりますが、pandas には DataFrame.group_by() という特定のColumnの内容でグループ分けする機能がありますので、こちらを使用すると良いかと思います。

Python

1# 年毎にグループ分け 2grouped_df = df.group_by(df['Party Date'].dt.year) 3# 各年毎にループ処理 4for year, df_by_year in grouped_df: 5 print(year) 6 print(df_by_year)

以上をまとめたサンプルを書きましたので参考にしてください。

Python

1import pandas as pd 2 3# 適当なデータの作成 4df = pd.DataFrame({ 5 'Party Date':['2016/11/1', '2016/12/1', '2017/1/1','2017/2/1'], 6 'Data':[1,2,3,4] 7}) 8 9# データ表示 10print(df) 11# Data Party Date 12# 0 1 2016/11/1 13# 1 2 2016/12/1 14# 2 3 2017/1/1 15# 3 4 2017/2/1 16 17# Data Pary の型表示 18print(df['Party Date'].dtype) 19# object 20 21# 'Party Date' Column を時系列データに変換 22df['Party Date'] = pd.to_datetime(df['Party Date']) 23 24# Data Pary の型表示 25print(df['Party Date'].dtype) 26# datetime64[ns] 27 28# Party Date Columnの年データでグループ分け 29grouped_df = df.groupby(df['Party Date'].dt.year) 30 31# 2016年のデータのみ抽出 32print(grouped_df.get_group(2016)) 33# Data Party Date 34# 0 1 2016-11-01 35# 1 2 2016-12-01 36 37# 2017年のデータのみ抽出 38print(grouped_df.get_group(2017)) 39# Data Party Date 40# 2 3 2017-01-01 41# 3 4 2017-02-01 42# ``` 43 44# ループで全ての年のデータに処理を行いたい場合 45for year, df_by_year in grouped_df: 46 print(year) 47 print(df_by_year)

投稿2017/12/14 00:28

magichan

総合スコア15898

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

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

yyone

2017/12/14 02:44

おっしゃる通り,PartyDateは文字列で,datetimeに変換することで楽に抽出ができました. 今回のコードで直接使うことはないかもしれないのですが, またほかのデータを扱う際には参考にさせていただこうと思います. 丁寧なご回答ありがとうございました.
guest

0

ベストアンサー

変数名を生成しながら、その変数に何かを代入するのは自然ではありません。
Pythonではこのような場合、辞書を経由して操作することが多いかと思います。

python

1stored_data = {} 2for i in range(2006,2015+1): 3 print("#") 4 print(i) 5 year_str = str(i) + '......' 6 df_str = 'df' + str(i) 7 stored_data[df_str] = df[df["Party Date"].str.contains(year_str)] 8 print(df_str, stored_data[df_str]) 9print(stored_data['df2006'])

投稿2017/12/13 08:09

mkgrei

総合スコア8560

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

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

yyone

2017/12/14 02:41

回答いただきありがとうございました. 自分で調べているときにも辞書を使用するようなことが書かれているブログなど見たのですが, 分かっていませんでした. 具体的にコードを書き直してくださったおかげで理解が進みましたので, ベストアンサーにさせていただきました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問