2016-10-29 131 views
1

私はいくつかのリストからなる配列を扱っています。各サブリストのうち、私は平均と標準を取りたいと思う。逸脱し、それらをExcelシートに書き込む。Python 3:numpy配列を扱い、openpyxl経由でエクスポートする

私が持っているコードはありますが、特にステップ(2)では、私はステップバイステップでnumpyを使用すると効率的にPythonを使用していないと感じるので、頭痛を与えます。また、私はopenpyxl writer( "total_list")に送ることができる形式でデータ( "total")を持たせるために、なぜステップ(3)の変更をしなければならないのか分かりません。

import numpy as np 
from openpyxl import Workbook 
from itertools import chain 

# (1) Make up sample array: 
arr = [[1,1,3], [3,4,2], [4,4,5], [6,6,5]] 

# (2) Make up lists containing average values and std. deviations 
avg = [] 
dev = [] 

for i in arr: 
    avg.append(np.mean(i)) 
    dev.append(np.std(i)) 

# (3) Make an alternating list (avg 1, dev 1, avg 2, dev 2, ...) 
total = chain.from_iterable(zip(avg, dev)) 

# (4) Make an alternative list that can be fed to the xlsx writer 
total_list = [] 
for i in total: 
    total_list.append(i) 

# Write to Excel file 
wb = Workbook() 
ws = wb.active 

ws.append(total_list) 
wb.save("temp.xlsx") 

私は添付の写真のようなフォーマットを持っていると思います。私はここに私のコードは、それがよりエレガントな作りで任意の助けをいただければ幸いです。すべてのデータが1つの行にあることは重要です。 Desired Output Format

それはかなり簡単にすべての言及の作業を行うことができますように私は、パンダモジュールを使用することになり
+0

希望のデータセットを投稿できますか?どのような形にしたいですか? – MaxU

+0

これを実行しようとすると、どのような問題が発生しますか? openpyxlはnumpy型をサポートしています。 –

答えて

1

改良:

In [272]: arr = [[1,1,3], [3,4,2], [4,4,5], [6,6,5]] 

このリストから配列を作成します。 np.meanはカバーの下にありますが、アクションを視覚化するのに役立ちますので、これは必須ではありません。

In [273]: arr = np.array(arr) 
In [274]: arr 
Out[274]: 
array([[1, 1, 3], 
     [3, 4, 2], 
     [4, 4, 5], 
     [6, 6, 5]]) 

ここで、配列全体の平均と標準偏差を計算します。行に作用させるにはaxis=1を使用してください。したがって、arrのサブリストで繰り返し処理しないでください。

これらの2つのアレイをインターリーブアレイに変換するには、さまざまな方法があります。 1つは縦に積み重ねて転置することです。これはリストzip(*...)トリックのnumpyの回答です。

In [281]: data=np.vstack([m,s]) 
In [282]: data 
Out[282]: 
array([[ 1.66666667, 3.  , 4.33333333, 5.66666667], 
     [ 0.94280904, 0.81649658, 0.47140452, 0.47140452]]) 
In [283]: data=data.T.ravel() 
In [284]: data 
Out[284]: 
array([ 1.66666667, 0.94280904, 3.  , 0.81649658, 4.33333333, 
     0.47140452, 5.66666667, 0.47140452]) 

私はopenpyxl', but can write a csv with savetxt`を持っていない:私はその列として保存します[data]dataので、計算された1Dで、savetxtを使用

In [296]: np.savetxt('test.txt',[data],fmt='%f', delimiter=',',header='#mean1 std1 ...') 
In [297]: cat test.txt 

# #mean1 std1 ... 
1.666667,0.942809,3.000000,0.816497,4.333333,0.471405,5.666667,0.471405 

。データの「行」を反復処理します。

1

:全体で

df.to_excel(r'/path/to/file.xlsx', index=False) 

import pandas as pd 

df = pd.DataFrame(arr) 

In [250]: df 
Out[250]: 
    0 1 2 
0 1 1 3 
1 3 4 2 
2 4 4 5 
3 6 6 5 

In [251]: df.T 
Out[251]: 
    0 1 2 3 
0 1 3 4 6 
1 1 4 4 6 
2 3 2 5 5 

In [252]: df.T.mean() 
Out[252]: 
0 1.666667 
1 3.000000 
2 4.333333 
3 5.666667 
dtype: float64 

In [253]: df.T.std(ddof=0) 
Out[253]: 
0 0.942809 
1 0.816497 
2 0.471405 
3 0.471405 
dtype: float64 

をあなたも簡単にExcelファイルとしてあなたのデータフレームを保存することができます

In [260]: df['avg'] = df.mean(axis=1) 

In [261]: df['dev'] = df.std(axis=1, ddof=0) 

In [262]: df 
Out[262]: 
    0 1 2  avg  dev 
0 1 1 3 1.666667 0.816497 
1 3 4 2 3.000000 0.707107 
2 4 4 5 4.333333 0.408248 
3 6 6 5 5.666667 0.408248 

In [263]: df.to_excel('d:/temp/result.xlsx', index=False) 

結果xlsx:

numpyのコード上

enter image description here

+1

FWIW openpyxlで、Dataframeオブジェクトを処理できるようになり、ユーザーは出力をより詳細に制御できます。 –

+0

@CharlieClark、新しい機能(例)へのリンクをいくつか共有できますか? – MaxU

+0

https://openpyxl.readthedocs.io/en/default/pandas.html –

関連する問題