73894


Python3でプログラムを書いています。

## 行いたいこと

[code]

    import numpy as np
    
    # vals サイズ[3,5]の数値配列
    vals = np.array([
        [  1.0,   2.0,   3.0,   4.0,   5.0],
        [ 10.0,  20.0,  30.0,  40.0,  50.0],
        [100.0, 200.0, 300.0, 400.0, 500.0]
    ])
    
    # vals サイズ[3]の文字列配列
    strs = ['str1','str2','str3',]
    
[/code]

という配列がある時、以下のようにcsvファイルに書き出したいです。つまり、csvファイル内で3行6列となるように書き出したいです。  
**csv出力 理想**

[code]

    str1, 1.0,   2.0,   3.0,   4.0,   5.0
    str2, 10.0,  20.0,  30.0,  40.0,  50.0
    str3, 100.0, 200.0, 300.0, 400.0, 500.0
    
[/code]

## 行ってみたこと

数値配列のみの書き出しであれば、  
**コード1**

[code]

    import csv
    with open('out.csv', 'w') as f:
        writer = csv.writer(f, lineterminator='\n')
        writer.writerows(vals)
    
[/code]

などとして書き出せたのですが、この左側の列に文字列配列を入れ込むことができません。  
今試してみた方法は、せめてまず文字列配列の情報を何でも良いから同じcsvに出力することを目指した、コード1のあとに  
**コード2**

[code]

    strs2 = [strs] # これがないと1セルに1文字が入ってしまう
    with open('out.csv', 'a') as f:
        writer = csv.writer(f, lineterminator='\n')
        writer.writerows(strs2)
    
[/code]

を追加する方法ですが、これだとcsv出力は  
**csv出力 現状**

[code]

    1.0,   2.0,   3.0,   4.0,   5.0
    10.0,  20.0,  30.0,  40.0,  50.0
    100.0, 200.0, 300.0, 400.0, 500.0
    str1,  str2,  str3 
    
[/code]

となってしまっています。

`writer.writerows`では行ごとに書かれていくようなので、まずは文字列を縦長に出力することを目指してみたのですが、文字列配列の転置などが上手くいかず(<https://jackee777.hatenablog.com/entry/2019/05/03/223646>
などのzipを使う方法を試したが、csvの1セルに1文字が出力されてしまった)、手作業でCSV内で列のコピーなどを行っています。

こちら何か良い方法をご存じの方、教えていただけないでしょうか。よろしくお願い致します。


CC BY-SA 4.0
2021-02-09T12:58:33.183
73891
2021-02-09T14:02:46.530
2021-02-09T14:02:46.530
30785
question
python python3 numpy csv
Pythonでの文字列配列・数値配列を合わせてcsv出力したい


数値と文字列が混在するような場合は Pandasが便利です

[code]

    import pandas as pd
    import sys
    
    pd.DataFrame(vals, index=strs)
    #          0      1      2      3      4
    #str1    1.0    2.0    3.0    4.0    5.0
    #str2   10.0   20.0   30.0   40.0   50.0
    #str3  100.0  200.0  300.0  400.0  500.0
    
    df = pd.DataFrame(vals, index=strs)
    
    df.to_csv(sys.stdout, header=False)
    #str1,1.0,2.0,3.0,4.0,5.0
    #str2,10.0,20.0,30.0,40.0,50.0
    #str3,100.0,200.0,300.0,400.0,500.0
    
[/code]

* * *

読み込む場合も同じように, Pandasから可能です

[code]

    df = pd.read_csv(csv_file, header=None, index_col=0)
    df.values # Numpyデータ
    
[/code]


CC BY-SA 4.0
2021-02-09T13:24:26.830
73892
2021-02-09T13:38:20.863
2021-02-09T13:38:20.863
43025
43025
73891
answer


`numpy`を使い続ける場合は、こちらの記事
[データの列方向への結合](https://ja.stackoverflow.com/q/73524/26370)
と同様に、文字列も`numpy.array`で2次元に作成して、`hstack()`で結合すれば良いでしょう。

これを：

[code]

    strs = ['str1','str2','str3']
    
[/code]

このようにして：

[code]

    strs = np.array([['str1'],['str2'],['str3']])
    csvdata = np.hstack([strs,vals])
    
[/code]

結果のcsvdataをcsvファイルに書くのは今までの物が使えるでしょう。

* * *

あるいはいったん1次元配列を作ってからnumpy.arrayに変換するのなら以下のようにします。

[code]

    strs = ['str1','str2','str3']
    strs = np.array(strs).reshape([3,1])
    
[/code]


CC BY-SA 4.0
2021-02-09T13:41:48.170
73893
2021-02-09T13:41:48.170
26370
73891
answer


[numpy.column_stack](https://numpy.org/doc/stable/reference/generated/numpy.column_stack.html#numpy-
column-stack) を使って以下の様にも書くことができます。

[code]

    import csv
    
    with open('out.csv', 'w') as f:
      writer = csv.writer(f, lineterminator='\n')
      writer.writerows(np.column_stack((strs, vals)))
    
[/code]

**output.csv**

[code]

    str1,1.0,2.0,3.0,4.0,5.0
    str2,10.0,20.0,30.0,40.0,50.0
    str3,100.0,200.0,300.0,400.0,500.0
    
[/code]


CC BY-SA 4.0
2021-02-09T14:00:08.070
73894
2021-02-09T14:00:08.070
73891
answer