

初心者なので言葉足らずかもしれませんがよろしくお願いします．

csvファイル（ファイル名"data"）で1列目に1行目から順に以下の様に書かれています．

**data.csv**

[code]

    0.1 0.2
    0.3 0.5
    0.2 0.7
    0.9 1.3
    1.5 0.8
    0.8 1.2
    1.1 0.9
    以下略
    
[/code]

列ごとに1行目から見ていき最初に1.0以上の数値を見つけ出しそれまでのデータを削除しそれをcsvで保存するプログラムを書こうとしていましたが書き方がわからず質問させていただきました．

[code]

    The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    
[/code]

というエラーが出てしまいました．

**現状のコード:**

[code]

    import numpy as np
    import pandas as pd
    from pandas import Series, DataFrame
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    data = 'data.csv'
    data = pd.read_csv(data)
    data = np.array(data)
    
    from itertools import dropwhile
    
    for x in (dropwhile(lambda y: y < 1.0, data)):
        print(x)
    
[/code]

最終的には以下の形を目指したいです．

[code]

    1.5 1.3
    0.8 0.8
    1.1 1.2
        0.9
    以下略
    
[/code]


CC BY-SA 4.0
2020-11-04T05:09:29.730
71712
2022-08-22T01:02:10.237
2020-11-04T05:38:23.173
32986
42568
question
python
csvファイルの内容を列ごとに処理するには？


前回の回答を応用して、スライスで列を切り出せば同様に処理出来るでしょう。  
[NumPy配列ndarrayの要素・行・列を取得（抽出）、代入](https://note.nkmk.me/python-numpy-select-
element-row-column-array/)  
[How to access the ith column of a NumPy multidimensional
array?](https://stackoverflow.com/q/4455076/9014308)

分けて出来た長さの異なるかもしれない各列のデータは、[itertools.zip_longest(*iterables,
fillvalue=None)](https://docs.python.org/ja/3/library/itertools.html#itertools.zip_longest)でまとめられます。  
`from itertools ...`の行以後を以下のようにすれば出来るでしょう。  
`itertools`からの`import`に`zip_longest`を追加します。

[code]

    from itertools import dropwhile, zip_longest
    
    d0 = [x for x in dropwhile(lambda y: y < 1.0, data[:,0])]
    d1 = [x for x in dropwhile(lambda y: y < 1.0, data[:,1])]
    
    NewData = np.array([[d0, d1] for d0,d1 in zip_longest(d0, d1, fillvalue='')])
    
    np.savetxt('NewData.csv', NewData, fmt='%s', delimiter=',')
    
[/code]

* * *

@metropolis さん同様、列数が変わっても対応出来るように考えてみました。  
numpy.arrayの`shape`で列数を取得してループします。

csv化は同じようにpandasを使いますが、こちらはDataFrameにした後、転置とfillna()で形を整えます。  
[pandas.DataFrameの行と列を入れ替える（転置）](https://note.nkmk.me/python-pandas-t-
transpose/)  
[pandasで欠損値NaNを除外（削除）・置換（穴埋め）・抽出](https://note.nkmk.me/python-pandas-nan-
dropna-fillna/)

こちらは`zip_longest`は使いません。

[code]

    work =[]
    for i in range(data.shape[1]):
        work.append([x for x in dropwhile(lambda y: y < 1.0, data[:,i])])
    
    df = pd.DataFrame(work).T.fillna('')
    
    df.to_csv('NewData.csv', header=False, index=False)
    
[/code]


CC BY-SA 4.0
2020-11-04T08:09:20.780
71716
2020-11-04T09:22:10.433
2020-11-04T09:22:10.433
26370
26370
71712
answer


[前回の回答](https://ja.stackoverflow.com/a/71668/16894)と同様の方法ですが、[pandas.concat](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.concat.html)で列を結合します(`outer join`)。

> このようなデータ列が3列あっても列ごとに処理する方法はありますか？

`data.shape[1]`(データフレームの列数)で list comprehension を実行していますので、任意の複数列に対応可能です。

[code]

    import pandas as pd
    
    data = 'data.csv'
    data = pd.read_csv(data, header=None)
    output = pd.concat([
      data.loc[data[i].ge(1.0).idxmax():][i].reset_index(drop=True)
      for i in range(data.shape[1])
    ], axis=1)
    
    output.to_csv('data_filtered.csv', header=False, index=False)
    
[/code]

[code]

    $ cat data_filtered.csv
    1.5,1.3
    0.8,0.8
    1.1,1.2
    ,0.9
    
[/code]


CC BY-SA 4.0
2020-11-04T08:37:56.943
71719
2020-11-04T08:37:56.943
71712
answer