Pythonでフォルダごとに分かれたデータを整理

## 3行で

* `glob.glob` フォルダ一覧を取得。
* （必要あれば）フォルダ毎に処理を実行 `subprocess.Popen`
* `pandas`でフォルダ毎の出力テキストファイルをまとめて`DataFrame`化しデータを整理。

## フォルダ名一覧を取得
### 標準バージョン（標準環境でOK）
```py
import os
dir = [d for d in os.listdir(".") if os.path.isdir(d)]
```
### よりかっこいい方法(正規表現使用可能）
```Python:Windows
import glob
dir = glob.glob(os.path.join("*",""))
```
```Python:Mac
dir = glob.glob("*/")
```

#### 正規表現使用例
フォルダ　case01, case02, ... を探す例

```Python
dir = glob.glob(os.path.join("case*",""))
```

もし、テキストファイル(.txt)だけ取得したければ。

```Python
dir = glob.glob("*.txt")
```

## フォルダ毎に処理プログラムを実行
```Python
import shutil
import subprocess

for f in dir:
    
    # copy files from local folder to target folder
    cp_files=["Addup_win.py","y.input"]
    for fi in cp_files:
        shutil.copy(fi,f)
        
    # remove files at target folder    
    rm_files=['y.out','out.tsv']
    for fi in rm_files:
        if os.path.exists(os.path.join(f,fi)):
            os.remove(os.path.join(f,fi))
            
    subprocess.Popen(["python","Addup_win.py"],cwd=f)
```

## pandsでフォルダごとに整理されたテキストデータを処理
データはタブ形式(.tsv)で、左からインデックス列、データ列を想定。
<img width="221" alt="スクリーンショット 2019-11-23 13.42.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226115/84bb670e-06ef-1ab5-df53-8e8e14cac2b2.png">

データの読み込みは、上記の処理プログラム失敗の可能性があるので、try:で対応。エラーフォルダは出力する必要あり。
indexは、フォルダ名から処理を入れて整えておいた方が後々便利。

```Python
import pandas as pd

dfs=pd.DataFrame()

for f in dir:
    # case01\\ => case01
    index_name = os.path.split(f)[0]
    
    # Error handle
    try:
        # Data structure {col.0 : index, col.1 : Data}
        df = pd.read_csv(os.path.join(f,"out.tsv"),sep='\t',header=None,index_col=0)
        dfs[index_name]=df.iloc[:,0]
    except:
        print("Error in {0}".foramt(index_name))
        
# make index
dfs.index = df.index
```

データを確認してみる。
（なぜが”0”行が入っているが、後で消えるので気にしない）

```Python
dfs.head()
```
<img width="466" alt="スクリーンショット 2019-11-23 15.12.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226115/3aa92b0e-6e6c-c1dd-2c42-6328ee6ed6ad.png">

## pandasで何らか処理

まず、行と列を入れ替えた方が処理しやすい。

```Python
dfsT = dfs.T
```
<img width="520" alt="スクリーンショット 2019-11-23 15.12.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226115/a0b8c516-622f-c599-fd89-e394ce7a19fc.png">

まず、欠損データ（NaN）の処理。

```Python
dfsT = dfsT.dropna()
```

ここからは適当に。

たとえば、ファンシーインデックスを使って、条件付きのデータを処理する。
（ここでは、WSA/L2列が0.2以上のデータを出す例）

```Python
dfsT_select = dfsT[dfsT["WSA/L2"] > 0.2]
```

### matplotlibによる可視化

```Python
import matplotlib.pyplot as plt

plt.bar(range(len(dfsT)),dfsT["WSA/L2"], \
        tick_label=dfsT.index)
plt.show()
```
<img width="385" alt="スクリーンショット 2019-11-23 14.58.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226115/3b4b8a9e-efe9-eaea-0d97-cfd6ace6f7ef.png">

 横軸の調整

```Python
fig, ax = plt.subplots()
ax.bar(range(len(dfsT)),dfsT["WSA/L2"], \
        tick_label=dfsT.index)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, fontsize=10);
```
<img width="377" alt="スクリーンショット 2019-11-23 14.58.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226115/a183a6c7-2333-4941-f615-74503c9f8ea0.png">


## Excelでの活用（出力）

データをExcelでくれと言う人が多いので、出してあげる。

```Python
dfs.to_excel("addup.xlsx")
```
<img width="453" alt="スクリーンショット 2019-11-23 15.15.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226115/9cf60936-928d-ea82-ca0f-fd9c3dd6e2c7.png">

テキスト形式で良い場合は、例えば以下。

```Python
dfs.to_csv("addup.tsv",sep='\t')
```