1

これは、多くのtxtファイルの1つがどのように見えるかのコピーです。

Class 1:
Subject A:
posX posY posZ  x(%)  y(%)
  0   2    0    81    72
  0   2   180   63    38
 -1  -2    0    79    84
 -1  -2   180   85    95
  .   .    .    .     .
Subject B:
posX posY posZ  x(%)   y(%)
  0   2     0    71     73
 -1  -2     0    69     88   
  .   .     .    .      .
Subject C:
posX  posY posZ x(%)   y(%)
  0    2    0    86     71
 -1   -2    0    81     55
  .    .    .     .     .
Class 2:
Subject A:
posX posY posZ  x(%)  y(%)
  0   2    0    81    72
 -1  -2    0    79    84
  .   .    .    .     .
  • クラス、サブジェクト、行エントリの数はすべて異なります。
  • Class1-Subject Aには、常に0と180が交互に現れるposZエントリがあります
  • クラス別および科目別のx(%)、y(%)の平均を計算します
  • クラス別および主題別のx(%)、y(%)の標準偏差を計算します
  • また、平均とstd_deviationsを計算するときは、180行のposZを無視してください。

私は(マクロとVBAを使用して)E​​xcelで扱いにくいソリューションを開発しましたが、Pythonでより最適なソリューションを探したいと思います。

numpyは非常に便利ですが、.mean()、. std()関数は配列でのみ機能します。私はまだ、パンダのgroupby関数と同様にそれについてさらに調査しています。

最終的な出力は次のようになります(1.クラス別、2。件名別)

 1. By Class                 
             X     Y                      
 Average                        
 std_dev     

 2. By Subject  
             X     Y
 Average
 std_dev                   
4

1 に答える 1

1

辞書(および辞書のリスト)を操作することは、Pythonでのデータの操作に慣れるための良い方法だと思います。このようにデータをフォーマットするには、テキストファイルを読み込み、変数を1行ずつ定義する必要があります。

始めること:

for line in infile:
    if line.startswith("Class"):
        temp,class_var = line.split(' ')
        class_var = class_var.replace(':','')   
    elif line.startswith("Subject"):
        temp,subject = line.split(' ')
        subject = subject.replace(':','')

これにより、現在のクラスと現在のサブジェクトに対応する変数が作成されます。次に、数値変数を読み込みます。これらの値を読み取る良い方法は、tryステートメントを使用して、それらを整数にしようとすることです。

    else:
        line = line.split(" ")
        try:
            keys = ['posX','posY','posZ','x_perc','y_perc']
            values = [int(item) for item in line]
            entry = dict(zip(keys,values))
            entry['class'] = class_var
            entry['subject'] = subject
            outputList.append(entry)
        except ValueError:
            pass

これにより、それらは以前に定義されたクラス変数とサブジェクト変数を含むディクショナリ形式になり、outputListに追加されます。あなたはこれで終わるでしょう:

[{'posX': 0, 'x_perc': 81, 'posZ': 0, 'y_perc': 72, 'posY': 2, 'class': '1', 'subject': 'A'},
{'posX': 0, 'x_perc': 63, 'posZ': 180, 'y_perc': 38, 'posY': 2, 'class': '1', 'subject': 'A'}, ...]

次に、辞書のリストをサブセット化することにより、SDを平均化/取得できます(posZ = 180などを除外するなどのルールを適用します)。クラスごとの平均は次のとおりです。

classes = ['1','2']
print "By Class:"
print "Class","Avg X","Avg Y","X SD","Y SD"
for class_var in classes:   

    x_m = np.mean([item['x_perc'] for item in output if item['class'] == class_var and item['posZ'] != 180])
    y_m = np.mean([item['y_perc'] for item in output if item['class'] == class_var and item['posZ'] != 180])
    x_sd = np.std([item['x_perc'] for item in output if item['class'] == class_var and item['posZ'] != 180])
    y_sd = np.std([item['y_perc'] for item in output if item['class'] == class_var and item['posZ'] != 180])

    print class_var,x_m,y_m,x_sd,y_sd

必要なものを正確に取得するには、印刷された出力をいじくり回す必要がありますが、これで開始できます。

于 2012-07-06T00:21:14.220 に答える