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

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

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

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

Python

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

Q&A

解決済

2回答

433閲覧

データフレーム内の数値をforループで処理

makina02

総合スコア2

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/02/09 06:40

編集2022/02/09 09:35

各データフレームから列ごとに平均値を取り出し、棒グラフを作成したいです。
数が多くなってきたため、後々の事を考えforループで処理したいのですが上手くいかず教えていただきたい次第です。

python

1names = ['A', 'B', 'C', 'D', 'E', 'F'] 2head = list(range(7, 23, 3)) 3footer = list(range(15, -1, -3)) 4 5for (names, head, footer) in zip(names, head, footer): 6 locals()[names] = pd.read_excel('data.xlsx', header=head, usecols=[1,2], skipfooter=footer, names=['data1', 'data2']) 7 print(locals()[names]) 8

上のコードで、エクセルからA~Fの3行2列のデータフレームを取得します。
ここまではやりたいことが実現できています。

その後、棒グラフを作成するために各データフレームの列ごとに平均値を取りたいと考えています。
その際、データ数が少なければ以下のようにひたすら羅列していれば良かったのですが
データが多くなってしまうためforループで処理したいと考えています。

python

1#羅列する場合 2A_data1 = A['data1'].mean() 3A_data2 = A['data2'].mean() 4B_data1 = B['data1'].mean() 5B_data2 = B['data2'].mean() 6C_data1 = C['data1'].mean() 7C_data2 = C['data2'].mean() 8D_data1 = D['data1'].mean() 9D_data2 = D['data2'].mean() 10E_data1 = E['data1'].mean() 11E_data2 = E['data2'].mean() 12F_data1 = F['data1'].mean() 13F_data2 = F['data2'].mean() 14 15data1 = np.array([A_data1, B_data1, C_data1, D_data1, E_data1, F_data1]) 16data2 = np.array([A_data2, B_data2, C_data2, D_data2, E_data2, F_data2]) 17 18#以下グラフ作成のコード 19

下記のように空のリストを作って、
A~Fのデータフレームの中にあるデータの平均値をとり、それを空のリスト内に入れていけば羅列する場合と同じことができると思っているのですが、どうにも上手くいきません。
forループで回す場合にはどのように記述すれば良いのでしょうか。

すいませんが教えていただけないでしょうか。

Python

1#forループで回す場合 2data1 =[] 3data2 =[] 4 5for i in names: 6 d1 = locals()[i]['data1'].mean() 7 data1.append(d1) 8 d2 = locals()[i]['data2'].mean() 9 data2.append(d2) 10 11#以下グラフ作成のコード

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

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

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

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

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

guest

回答2

0

ベストアンサー

forループで回す場合にはどのように記述すれば良いのでしょうか。

以下はリスト内包表記を使う場合です。

python

1names = ['A', 'B', 'C', 'D', 'E', 'F'] 2means = pd.concat([globals()[n].mean() for n in names], axis=1).T 3data1, data2 = means['data1'].values, means['data2'].values

投稿2022/02/09 17:19

melian

総合スコア19798

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

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

makina02

2022/02/10 00:30

ご回答ありがとうございました。 自分なりに勉強させていただき、別の方が言っていた意味をようやく理解できました。 1つだけまだ理解できていない点があるのですが、ここでglobals()を使う理由は何でしょうか? 教えていただけないでしょうか。
melian

2022/02/10 01:37

理由はリスト内包表記が独自のスコープを持っているからです。なので、locals() を使うと A や B などの変数にアクセスできなくなってしまうのです。
makina02

2022/02/10 03:42

追加で調べて理解できました。 色々と回答いただきありがとうございました。
guest

0

DataFrame.mean()で平均値のSeriesが取得できますのでこちらを使用すれば良いかと思います。

Python

1import pandas as pd 2 3df = pd.DataFrame({'A':[1,2,3], 'B':[10,20,30], 'C':[4,5,6]}) 4print(df) 5# A B C 6#0 1 10 4 7#1 2 20 5 8#2 3 30 6 9 10print(df.mean()) 11#A 2.0 12#B 20.0 13#C 5.0 14#dtype: float64

投稿2022/02/09 11:27

meg_

総合スコア10580

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

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

makina02

2022/02/09 14:50

ご回答ありがとうございます。 私が理解できておらず申し訳ないのですが、 私が書いた例のようにA〜Fまでそれぞれのデータフレームがあり、 順々に平均値を出していきたい場合はどのようにこちらを適用すれば良いのでしょうか? すいませんが教えてください。
meg_

2022/02/09 15:10

> 私が書いた例のようにA〜Fまでそれぞれのデータフレームがあり、順々に平均値を出していきたい場合 列名は共通でしょうか? 上記例ですと「df.mean()['A']」で「2.0」が取得できます。 df.mean().indexで平均値のSeriesの列名一覧も取得できます。 複数データフレームへの対応はdf.mean()をリストに入れるなりしてループ処理すれば良いかと思います。 やり方は色々ありますのでループ処理でデータフレームから毎回平均値を算出する方法でも良いかとは思います。 ご自身の分かりやすい方法で実装なさってください。
makina02

2022/02/10 00:33

ご回答ありがとうございました。 私の理解不足もあり、別の方に書いていただいたコードでようやく理解できました。 まだ基礎が分かっていないところが多く、改めて勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問