

例

weather.txtに茨城の2000年1～2021年12月の月平均のデータがある。  
年,1月の気温,2月の気温,・・・,12月の気温の順で保存されている。

weather.txtを読み込み、各年・各月の平均気温を出力するプログラム

[code]

    2000,7.6,6.0,9.4,14.5,19.8,22.5,27.7,28.3,25.6,18.8,13.3,8.8
    2001,4.9,6.6,9.8,15.7,19.5,23.1,28.5,26.4,23.2,18.7,13.1,8.4
    2002,7.4,7.9,12.2,16.1,18.4,21.6,28.0,28.0,23.1,19.0,11.6,7.2
    2003,5.5,6.4,8.7,15.1,18.8,23.2,22.8,26.0,24.2,17.8,14.4,9.2
    2004,6.3,8.5,9.8,16.4,19.6,23.7,28.5,27.2,25.1,17.5,15.6,9.9
    2005,6.1,6.2,9.0,15.1,17.7,23.2,25.6,28.1,24.7,19.2,13.3,6.4
    2006,5.1,6.7,9.8,13.6,19.0,22.5,25.6,27.5,23.5,19.5,14.4,9.5
    2007,7.6,8.6,10.8,13.7,19.8,23.2,24.4,29.0,25.2,19.0,13.3,9.0
    2008,5.9,5.5,10.7,14.7,18.5,21.3,27.0,26.8,24.4,19.4,13.1,9.8
    2009,6.8,7.8,10.0,15.7,20.1,22.5,26.3,26.6,23.0,19.0,13.5,9.0
    2010,7.0,6.5,9.1,12.4,19.0,23.6,28.0,29.6,25.1,18.9,13.5,9.9
    2011,5.1,7.0,8.1,14.5,18.5,22.8,27.3,27.5,25.1,19.5,14.9,7.5
    2012,4.8,5.4,8.8,14.5,19.6,21.4,26.4,29.1,26.2,19.4,12.7,7.3
    2013,5.5,6.2,12.1,15.2,19.8,22.9,27.3,29.2,25.2,19.8,13.5,8.3
    2014,6.3,5.9,10.4,15.0,20.3,23.4,26.8,27.7,23.2,19.1,14.2,6.7
    2015,5.8,5.7,10.3,14.5,21.1,22.1,26.2,26.7,22.6,18.4,13.9,9.3
    2016,6.1,7.2,10.1,15.4,20.2,22.4,25.4,27.1,24.4,18.7,11.4,8.9
    2017,5.8,6.9,8.5,14.7,20.0,22.0,27.3,26.4,22.8,16.8,11.9,6.6
    2018,4.7,5.4,11.5,17.0,19.8,22.4,28.3,28.1,22.9,19.1,14.0,8.3
    2019,5.6,7.2,10.6,13.6,20.0,21.8,24.1,28.4,25.1,19.4,13.1,8.5
    2020,7.1,8.3,10.7,12.8,19.5,23.2,24.3,29.1,24.2,17.5,14.0,7.7
    2021,5.4,8.5,12.8,15.1,19.6,22.7,25.9,27.4,22.3,18.2,13.7,7.9
    
[/code]

どのようなプログラムになるか教えてください


CC BY-SA 4.0
2022-06-27T11:15:10.873
89629
2022-06-28T23:22:09.410
2022-06-28T14:26:04.130
3054
53061
question
python
コンマ区切りのテキストファイルから平均を算出したい


おそらく「何に困っているのか」と聞かれても、「全てが解らない」としか言いようがない状態だと推測します。そうだとすると、挑戦の幅が大きすぎるという事です。まずは、やる事を細かいステップに分解し、一つ一つ取り組んで下さい。小さなステップごとであれば、キーワードで検索をしたり、このような質問サイトで扱うのも簡単です。

### データを行ごとに読み込む

[code]

    with open("weather.txt") as file:
        for line in file:
            line = line.rstrip()  # 改行の削除
    
[/code]

参考:

  * [ファイルを読み書きする](https://docs.python.org/ja/3/tutorial/inputoutput.html#reading-and-writing-files)
  * [`str.rstrip`](https://docs.python.org/ja/3/library/stdtypes.html#str.rstrip)

### 行を区切り文字で分割

[code]

    str_list = line.split(",")
    year = str_list[0]
    
[/code]

参考:
[`str.split`](https://docs.python.org/ja/3/library/stdtypes.html#str.split)

### 文字列から数値（浮動小数点数）への変換

[code]

    for month in range(1, 13):
        temperature = float(str_list[month])
    
[/code]

参考:

  * [数値型](https://docs.python.org/ja/3/library/stdtypes.html#numeric-types-int-float-complex)
  * [`float`](https://docs.python.org/ja/3/library/functions.html#float)

* * *

これまでをまとめると、例えばこのようになります。

[code]

    with open("weather.txt") as file:
        for line in file:
            line = line.rstrip()  # 改行の削除
            str_list = line.split(",")
            year = str_list[0]
            print(f"-- {year}年 --")
    
            for month in range(1, 13):
                temperature = float(str_list[month])
                print(f"{year}年 {month}月の温度: {temperature}")
    
[/code]

読み込んだデータをすぐに使うのでは無く、リストなどに保存していく場合もあります。今回はやることがシンプルなので、このままとします。

* * *

### 平均を求める

平均は、

  * 例えば `〜total` のような命名で変数を用意し、`0` で初期化
  * `+=` などで要素の数値を加算していく
  * 全て足し終えたら、要素数で割る

といった手順で求められます。質問のケースでは「各月の平均」が少し難しいかも知れません。1月から12月まで、`month1_total`、
`month2_total`、 のように12個の変数を用意するのはよくないです。こういった場合は、リストにまとめます。

[code]

    # 例:
    
    # 初期化
    month_total_list = [0.0] * 12
    
    # 加算
    month_total_list[i] += temperature
    
[/code]

リストのインデックスは `0`
で始まるので、この場合は月の名前と一つずれますので注意しましょう。こういった平均を求めるコードを今までのコードに挿入すると、完成です。

[code]

    with open("weather.txt") as file:
        month_total_list = [0.0] * 12
        year_count = 0
    
        for line in file:
            year_count += 1
    
            line = line.rstrip()  # 改行の削除
            str_list = line.split(",")
            year = str_list[0]
            #print(f"-- {year}年 --")
    
            year_total = 0.0
            for month in range(1, 13):
                temperature = float(str_list[month])
                #print(f"{year}年 {month}月の温度: {temperature}")
                year_total += temperature
                month_total_list[month - 1] += temperature
            print(f"{year}年の平均温度: {year_total / 12}")
    
        print("-- 各月の平均 --")
        for i in range(0, 12):
            print(f"{i + 1}月の平均温度: {month_total_list[i] / year_count}")
    
[/code]

上記コードはテストしていません。また、[浮動小数点数の計算には誤差があります](https://docs.python.org/ja/3/tutorial/floatingpoint.html)。


CC BY-SA 4.0
2022-06-28T14:21:58.287
89651
2022-06-28T14:21:58.287
3054
89629
answer


おそらく初期段階であろう学習状況を無視して考えると、`pandas`を使うのが短く出来て簡単になります。  
こちらの4行で読み込みと平均値計算が出来ます。

[code]

    import pandas as pd
    df = pd.read_csv('weather.txt', header=None, index_col=0)
    df['年間平均気温'] = df.mean(axis=1)
    df = pd.concat([df, pd.DataFrame(df.mean(), columns=['月毎平均気温']).T], axis=0)
    
[/code]

続けてこうすれば元データも含めてすべてを表示できます。

[code]

    pd.set_option('display.unicode.east_asian_width', True)
    pd.options.display.float_format = '{:,.1f}'.format
    print(df)
    
[/code]

算出した値だけを表示したい場合は、上記`print(df)`の代わりに以下のようにします。

[code]

    print('年間平均気温')
    print(df['年間平均気温'][:-1].to_string())
    print('')
    print(df.iloc[-1:, 0:12].T)
    
[/code]


CC BY-SA 4.0
2022-06-28T23:22:09.410
89654
2022-06-28T23:22:09.410
26370
89629
answer