ご質問、失礼いたします。
pythonにてあるフォルダ(input)にある複数のcsvファイルから一定条件のデータを抽出し、一つのデータとして結合。
そのmax値を出力するグラフの目盛りの最大値にしたいと思っているのですがうまくできません。
ご教授いただけますと幸いです。
何卒よろしくお願いいたします。
環境:windows10でPycharmを使用
Python
1import pandas as pd 2import os 3import glob 4import matplotlib.pyplot as plt 5 6data_path = os.path.abspath(r"C:\Users\user\PycharmProjects\pythonProject1\input") 7files = glob.glob(data_path + '/*.csv') 8save_dir = r'C:\Users\user\PycharmProjects\pythonProject1\output' 9 10total_list = [] 11df = [] 12labels = ['50', '60', '70', '80', '90', '100', '110', '120', '130', '140', '150', '160', '170', '180', '190', '200', '210', '220', '230', '240'] 13 14for file in files: 15 filename, file_extension = os.path.splitext(file) 16 basename = os.path.basename(filename) 17 csvfile = pd.read_csv(file, header=6) 18 df2 = pd.cut(csvfile['Diameter (um)'], list(range(50,260,10)), labels=labels, right=False).value_counts(sort=False) 19 df3 = pd.DataFrame(df2) 20 df4 = df3.rename(columns={'Diameter (um)': 'count'}) 21 22 df3['name'] = basename 23 total_list.append(df3) 24 df = pd.concat(total_list) 25 df.to_csv('output/joint.csv') 26 max_value = pd.DataFrame.max(df, numeric_only=True) 27 28 axis = df4.plot.bar(rot=0) 29 plt.title(basename) 30 plt.xlabel("Diameter (um)") 31 plt.ylabel("count") 32 plt.ylim(0, max_value + 20)#←ここのmax_valueを添付した画像の赤丸(100)+20にしたい 33 print(axis) 34 plt.savefig(os.path.join(save_dir, str(basename) + str() + '.png')) 35 36 37
C:\Users\user\PycharmProjects\pythonProject1\venv\Scripts\python.exe C:/Users/user/PycharmProjects/pythonProject1/proto2.py Traceback (most recent call last): File "C:\Users\user\PycharmProjects\pythonProject1\proto2.py", line 31, in <module> plt.ylim(0, max_value) File "C:\Users\user\PycharmProjects\pythonProject1\venv\lib\site-packages\matplotlib\pyplot.py", line 1757, in ylim ret = ax.set_ylim(*args, **kwargs) File "C:\Users\user\PycharmProjects\pythonProject1\venv\lib\site-packages\matplotlib\axes\_base.py", line 3876, in set_ylim if bottom == top: File "C:\Users\user\PycharmProjects\pythonProject1\venv\lib\site-packages\pandas\core\generic.py", line 1442, in __nonzero__ raise ValueError( ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Process finished with exit code 1
print(df)
1 Diameter (um) name 250 30 A-1 360 20 A-1 470 20 A-1 580 20 A-1 690 19 A-1 7100 13 A-1 8110 16 A-1 9120 15 A-1 10130 22 A-1 11140 25 A-1 12150 26 A-1 13160 17 A-1 14170 10 A-1 15180 2 A-1 16190 2 A-1 17200 1 A-1 18210 0 A-1 19220 0 A-1 20230 0 A-1 21240 0 A-1 22 Diameter (um) name 2350 30 A-1 2460 20 A-1 2570 20 A-1 2680 20 A-1 2790 19 A-1 28100 13 A-1 29110 16 A-1 30120 15 A-1 31130 22 A-1 32140 25 A-1 33150 26 A-1 34160 17 A-1 35170 10 A-1 36180 2 A-1 37190 2 A-1 38200 1 A-1 39210 0 A-1 40220 0 A-1 41230 0 A-1 42240 0 A-1 4350 20 B-5 4460 9 B-5 4570 3 B-5 4680 3 B-5 4790 5 B-5 48100 9 B-5 49110 8 B-5 50120 5 B-5 51130 7 B-5 52140 3 B-5 53150 5 B-5 54160 18 B-5 55170 41 B-5 56180 79 B-5 57190 86 B-5 58200 100 B-5 59210 65 B-5 60220 39 B-5 61230 21 B-5 62240 7 B-5
エラー発生行はどこですか?エラーメッセージ全文を載せていただけませんか?
大変失礼いたしました。
エラーメッセージを全文に訂正いたしました。
max_value=float(max_value)とした後にプロットするとどうなりますか?
ありがとうございます。
エラーはなくなりグラフは出力できたのですが、
目盛りがそれぞれの最大値(添付画像の30と100)で出力されます。
max_valueの中身が
30.0
100.0
になっていたので、
改めてmax(max_value)で抽出しようとしたのですが
----------------------------------------------------
Traceback (most recent call last):
File "C:\Users\user\PycharmProjects\pythonProject1\proto2.py", line 34, in <module>
print(max(max_value))
TypeError: 'float' object is not iterable
----------------------------------------------------
とエラーが出てしまします。
最大値を取得するときに列を指定した方が良いのではないでしょうか。
ご返事遅れてしまい申し訳ありません。
私のやり方が悪いのかもしれませんが、
出力されたcsvファイル(df.to_csv('output/joint.csv'))は添付させていただいた写真のようになっているのですが、
printで出力すると追加させていただいた内容のように、
A-1のデータがダブってしまっています。
なのでmax値が30と100になっているのかと思われます。
どこかダブってしまう要素のコードがあるのでしょうか?
いくつか気になる点があります。
・dfはcsvファイルから生成されたdf3を元に作成されている
・グラフ化しているのはdf4である
・max_valueはdfから取得している
・同じフィル名('output/joint.csv')で上書き保存している
> printで出力すると追加させていただいた内容のように・・・
上記の件はループ処理中にprint()を入れたので単純に2回表示されただけだと思われます。それであれば問題なしです。
> なのでmax値が30と100になっているのかと思われます。
A-1の最大値は30、B-5の最大値は100なので合っていますね。
質問者さんの本当にやりたいこととコードがちょっと合っていないのでは?
質問者さんの欲しい最大値は対象の全csvのDiameter (um)の最大値なのではないですか?
meg_様
meg_様の記載通りでした。
ループ外でmaxをprintしたところ100のみとなっておりましたので、
上記のコードとは違いか所でグラフの出力ループを行ったところうまくできました。
まだまだ自分の書いているコードの内容の理解が足りないようです。
>いくつか気になる点があります。
お指摘通り、自分でも見にくい(dfがいくつもある)内容だと思っていました。
コードの内容を理解するだけでなく、今後は見返したときに見やすいコード作りも心掛けたいと思います。
前回(2週間前)にも引き続き、
お忙しいところ、ご教授いただきありがとうございました。
ベストアンサーなのですが、いち早くご質問いただいたのは
meg_様なのですが、回答という形でppaul様にお答えいただいたので、
今回はppaul様をベストアンサーにさせていだだきます。
親切丁寧にご教授いただけたのに大変申し訳ございません。
もし機会がございましたら今後ともよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー