1

複数の行と 8 列のデータ ファイルがあります - 列 1、2、5 に同じデータがある行の列 8 を平均したい - たとえば、私のファイルは次のようになります。

564645  7371810 0   21642   1530    1   2   30.8007
564645  7371810 0   21642   8250    1   2   0.0103
564645  7371810 0   21643   1530    1   2   19.3619

列 1-2-5 が同一であるため、1 行目と 3 行目の最後の列を平均したいと考えています。

出力を次のようにしたい:

564645  7371810 0   21642   1530    1   2   25.0813
564645  7371810 0   21642   8250    1   2   0.0103

私のファイル(テキストファイル)はかなり大きく(〜10000行)、冗長データ(上記のルールに基づく)は一定の間隔ではないため、コードで冗長データを見つけて平均化する必要があります...

larsks コメントへの応答 - これが私の 4 行のコードです...

import os
import numpy as np
datadirectory = input('path to the data directory, ')
os.chdir( datadirectory)

##READ DATA FILE AND CREATE AN ARRAY
dataset = open(input('dataset_to_be_used, ')).readlines()
data = np.loadtxt(dataset)
##Sort the data based on common X, Y and frequency
datasort = np.lexsort((data[:,0],data[:,1],data[:,4]))
datasorted = data[datasort]
4

4 に答える 4

0

OK、Huryの入力に基づいて、コードを更新しました-

import os #needed system utils
import numpy as np# for array data processing
import pandas as pd #import the pandas module
datadirectory = input('path to the data directory, ')
working = os.environ.get("WORKING_DIRECTORY", datadirectory) 
os.chdir( working)

 ##READ DATA FILE AND and convert it to string
dataset = open(input('dataset_to_be_used, ')).readlines()
data = ''.join(dataset) 

df = pd.read_csv(data, sep="\\s+", header=None)
sorted_data = df.groupby(["X.1","X.2","X.5"])["X.8"].mean().reset_index()
tuple_data = [tuple(x) for x in sorted_data.values]
datas = np.asarray(tuple_data)

これは、huryによって投稿されたように、テストデータで機能しましたが、df = ...の後にファイルを使用すると、機能しないようです(次のような出力が得られます:

トレースバック(最後の最後の呼び出し):ファイル "/media/DATA/arxeia/Programming/MyPys/data_refine_average.py"、31行目、df = pd.read_csv(data、sep = "\ s +"、header = None)ファイル"/usr/lib64/python2.7/site-packages/pandas/io/parsers.py"、行187、read_csv return _read(TextParser、filepath_or_buffer、kwds)ファイル "/usr/lib64/python2.7/site- packages / pandas / io / parsers.py "、141行目、_read f = com._get_handle(filepath_or_buffer、'r'、encoding = encoding)ファイル" /usr/lib64/python2.7/site-packages/pandas/core /common.py "、行673、_get_handle f = open(path、mode)IOError:[Errno 36]ファイル名が長すぎます: '564645 \ t7371810 \ t0 \ t21642 \ t1530 \ t1 \ t2 \ t30.8007 \ r \ n564645 \ t7371810 \ t0 \ t21642 \ t8250 \ t1 \ t2 \ t0.0103 \ r \ n564645 \ t7371810 \ t0 \ t21642 \ t20370 \ t1 \ t2\t0。0042 \ r \ n564645 \ t7371810 \ t0 \ t21642 \ t33030 \ t1 \ t2 \ t0.0026 \ r \ n564645 \ t7371810 \ t0 \ t21642 \ t47970 \ t1 \ t2 \ t0.0018 \ r \ n564645 \ t7371810 \ t0 \ t21642 \ t63090 \ t1 \ t2 \ t0.0013 \ r \ n564645 \ t7371810 \ t0 \ t21642 \ t93090 \ t1 \ t2 \ t0.0009 \ r \ n564645 \ t7371810 \ t0 \t216........。 。

何か案は?

于 2012-12-14T21:06:15.997 に答える
0
import os #needed system utils
import numpy as np# for array data processing


datadirectory = '/media/DATA/arxeia/Dimitris/Testing/12_11'
working = os.environ.get("WORKING_DIRECTORY", datadirectory)
os.chdir( working)

##ここで、ファイルを読み取ろうとして、次の行の文字列の名前を使用しようとしました-これにより、以下に説明する同じエラーが発生しました(エラー#42(と思います)-名前が大きすぎます)

data_dict = {} #Create empty dictionary
for line in open('/media/DATA/arxeia/Dimitris/Testing/12_11/1a.dat'): ##above error resolved when used this
    line = line.rstrip()
    columns = line.split()
    entry = [columns[0], columns[1], columns[4]]
    entry = "-".join(entry)
    try: #valid if have already seen combination of 1,2,5
        x = data_dict[entry].append(float(columns[7])) 
    except (KeyError): #KeyError the first time you see a combination of columns 1,2,5
        data_dict[entry] = [float(columns[7])]

for entry in data_dict:
    value = np.mean(data_dict[entry])   
    output = entry.split("-")
    output.append(str(value))
    output = "\t".join(output)
   print output

私のもう1つの問題は、文字列形式(または任意の形式)で出力を取得することです-保存部分にアクセスして最終形式を操作できることを知っていると思います

np.savetxt('sorted_data.dat', sorted, fmt='%s', delimiter='\t') #Save the data

私はまだ他の列を追加する方法を考えなければなりません - 私もそれに取り組んでいます

于 2012-12-15T21:03:44.683 に答える
0

それは最もエレガントな答えではなく、それがどれほど高速で効率的かはわかりませんが、あなたが提供した情報に基づいて仕事を成し遂げると信じています:

import numpy

data_file = "full_location_of_data_file"
data_dict = {}
for line in open(data_file):
    line = line.rstrip()
    columns = line.split()
    entry = [columns[0], columns[1], columns[4]]
    entry = "-".join(entry)
    try: #valid if have already seen combination of 1,2,5
        x = data_dict[entry].append(float(columns[7]))
    except (KeyError): #KeyError the first time you see a combination of columns 1,2,5
        data_dict[entry] = [float(columns[7])]

for entry in data_dict:
    value = numpy.mean(data_dict[entry])   
    output = entry.split("-")
    output.append(str(value))
    output = "\t".join(output)
    print output

列 3、6、または 7 が必要かどうかが不明なので、省略しました。特に、それらの中に存在する可能性のあるさまざまな値をどのように処理したいかを明確にしません。必要な動作について詳しく説明できる場合 (つまり、特定の値をデフォルトにする、または最初に出現するもの)、デフォルト値を入力するか、最初のインスタンスをリストの辞書ではなく辞書の辞書に保存することをお勧めします。

于 2012-12-14T22:50:29.803 に答える
0

パンダを使用してこれをすばやく行うことができます。

import pandas as pd
from StringIO import StringIO
data = StringIO("""564645  7371810 0   21642   1530    1   2   30.8007
564645  7371810 0   21642   8250    1   2   0.0103
564645  7371810 0   21643   1530    1   2   19.3619
""")
df = pd.read_csv(data, sep="\\s+", header=None)
df.groupby(["X.1","X.2","X.5"])["X.8"].mean()

出力は次のとおりです。

X.1     X.2      X.5 
564645  7371810  1530    25.0813
                 8250     0.0103
Name: X.8

インデックスが必要ない場合は、次を呼び出すことができます。

df.groupby(["X.1","X.2","X.5"])["X.8"].mean().reset_index()

これにより、次のような結果が得られます。

      X.1      X.2   X.5      X.8
0  564645  7371810  1530  25.0813
1  564645  7371810  8250   0.0103
于 2012-12-14T03:49:36.800 に答える