

Jupyter Notebookを使いPython3でプログラムを作成しようとしています。

ヒストグラムのデータ(階級値と度数)が記述されているtxtファイルから、データを読み込みそれぞれのヒストグラムのデータを量的データにばらしてから、各ヒストグラムの量的データごとにまとめて二次元配列に格納したいです。(分かりずらい表現ですみません)  
以下はヒストグラムのデータが入ったtxtファイルの内容です。Band1とBand2という2つのヒストグラムのデータがあります。DN列は階級値で、Npts列は度数の列です。

[code]

    Histogram       DN     Npts
    Band 1           1        1
                     2        2
                     3        1
    
    Histogram       DN     Npts
    Band 2           2        1
                     3        2
                     4        1
    
[/code]

以下では、ヒストグラムの量的データを別々に表示するところまでのプログラムです。

[code]

    with open(path) as fp:
        # 無駄な行を取り除く
        lst = [ln.split() for ln in fp
                    if not ln.startswith('Histogram') and ln.strip()]
    
    res = []
    #Histgramが記載されていない行を補完する
    for ln in lst:
        n = len(ln)
    
        if n > 2:
            pre = ''.join(ln[:n -2])
        res.append([pre] +ln[-2:])
    
    #groupbyでまとめる
    from itertools import groupby, repeat
    for k,g in groupby(res, key=lambda ln: ln[0]):
        sublist = []
        print(k, sum((list(repeat(int(ln[1]), int(ln[2])))for ln in g), start=[]))
    #Band1 [1, 2, 2, 3]
    #Band2 [2, 3, 3, 4]
    
[/code]

出力させたい2次元配列を以下に示します

[code]

    [[1, 2, 2, 3], [2, 3, 3, 4]]
    
[/code]

イテレーターがよくわからず、上手く配列に格納できません。  
-追記-  
Bandごとにファイルを分けたり、Excelに入れてシート別に入れたいのですが、データを入手する際に30個ほどのBandがまとめて出力されてしまいます。そのため、各Bandについてファイルを作成することが困難です。こう言った理由で、1つのファイルに複数のバンドがまとめて入ったものを読み込んで配列に格納したいと考えています。  
(元データはソフトウェアENVIの統計情報です)


CC BY-SA 4.0
2023-02-01T16:14:50.503
93676
2023-02-07T06:04:58.503
2023-02-02T03:01:50.483
55619
55619
question
python
複数のHistogramデータを量的データに戻して二次元配列に格納したい


既に個々のリストが出力できているなら，それらを一つのリストに格納すれば御希望の出力は得られそうです。具体的には最後の `for k, g in ...`
以降を下記のように変更します。

[code]

    all_list = []
    for k, g in groupby(res, key=lambda ln: ln[0]):
        sublist = sum((list(repeat(int(ln[1]), int(ln[2])))
                       for ln in g), start=[])
        print(k, sublist)
        all_list.append(sublist)
    
    print(all_list)
    
[/code]


CC BY-SA 4.0
2023-02-07T01:06:32.100
93735
2023-02-07T01:06:32.100
54588
93676
answer


もしかしたらこの質問は [XY問題](https://ja.meta.stackoverflow.com/q/2701)
であって、追記された「Bandごとにファイルを分けたり、Excelに入れてシート別に入れたい」というのも私がコメントした内容を取り入れたからなのでは？

質問内容は中間的な段階の処理であって、実は以下のような形の2次元配列を作りたいのではありませんか？
集計(されたように見える)結果を階級値の並びに展開し直すといった処理は、当初の計測/発生した時刻とか場所の別のデータと紐付けられているといったことで無ければ意味が無いように思えます。

■各Bandデータを列として横に並べる

[code]

       Band 1 Band 2
    DN
    1       1
    2       2      1
    3       1      2
    4              1
    
[/code]

■各Bandデータを行として縦に並べる

[code]

    DN      1  2  3  4
    Band 1  1  2  1
    Band 2     1  2  1
    
[/code]

以前の質問のデータも同様に以下の形にしたいのでは？

[code]

        Band 1 Band 2 Band 3
    DN
    178      1
    179      2      6
    180      3      1
    181      6      5      6
    182      8     13      8
    183     10     21     10
    184     10     31     10
    185     11     12     11
    186     15      5     10
    187     17            17
    188     13            13
    189     10            10
    190      1             1
    
[/code]

あるいはこちら

[code]

    DN     178 179 180 181 182 183 184 185 186 187 188 189 190
    Band 1   1   2   3   6   8  10  10  11  15  17  13  10   1
    Band 2       6   1   5  13  21  31  12   5
    Band 3               6   8  10  10  11  10  17  13  10   1
    
[/code]

上記はこんなプログラムで出来ます。

[code]

    import pandas as pd
    import re
    import io
    
    sep = re.compile(r'\n[\s]*\n')
    
    #### 1つのファイルにまとめられたデータをそれぞれのバンド毎に切り離す
    #### 各バンドデータは空白行で区切られているものとする
    datafile = 'sample.txt'
    with open(datafile) as f:
        bandarray = sep.split(f.read())
    
    #### 各バンドデータをpandas DataFrameとして読み込み、結合する
    #### 縦軸(行)が階級値、横軸(列)が対応するバンド
    result = pd.DataFrame()
    for band in bandarray:
        df = pd.read_fwf(io.StringIO(band), dtype='str')
        bandname = df['Histogram'][0]
        df = df[['DN','Npts']]
        df.columns = ['DN',bandname]
        df.set_index('DN', inplace=True)
        result = pd.concat([result, df], axis=1)
    
    #### 各バンドで存在しない階級値が NaN になっているので空文字列に変換する
    result.fillna('', inplace=True)
    
    #### 配列にまとめた結果を表示する
    print('====Bandデータを列として横に並べる====')
    print(result)
    print('')
    print('====Bandデータを行として縦に並べる====')
    print(result.T)
    
[/code]

結果をそのままCSVやExcelの形式でファイルに書き出せば、バンド毎のファイルやシートに分けるよりも、その後のデータ加工が簡単になると思われます。


CC BY-SA 4.0
2023-02-07T05:54:54.923
93740
2023-02-07T06:04:58.503
2023-02-07T06:04:58.503
26370
26370
93676
answer