1

40列×800行のCSVデータセットがあります。しかし、例として、次のように見えるとしましょう:

Ref  X  Y
11   1  10 
11   2  9
11   3  8
11   4  7
12   5  6 
12   6  5
12   7  4
13   8  3
13   9  2

各 Ref の平均 X 値と Y 値のリストを返す関数をどのように定義しますか? つまり、次のような結果が得られます。

Ref_list = [11,12,13]        
Av_X = [2.5,6,12.5]

これが最善の方法だとは思いませんが、次のコードを書きました。

my_data = genfromtxt('somedata.csv', delimiter=',',skiprows=1) 

X=[]
for i in my_data:
    X.append(i[0])
    counter=collections.Counter(X)
    keys=np.sort((counter.keys())) #find and sort ref key values

def getdata():
    X , Y = [], []
    for i in my_data:
       if i[0] == refs:
           X.append(i[1])
           Y.append(i[2])
    AV_X=np.average(X)
    AV_Y=np.average(X)
    return AV_X, AV_Y

for refs in keys: # run function over key range 
    AV_X, AV_Y = getdata()

ここで行き詰まりました。参照番号の範囲で関数を反復しようとしていました。(キー) 返された値を追加します。しかし、エラー以外では、最後の Ref の値しか取得できません。キーで。

これを行うにはもっと良い方法があると思いますが、私はまだこのような初心者です。提案をお寄せいただきありがとうございます

4

5 に答える 5

5

これらの種類のジョブには、鮮やかなpandasライブラリを使用できます。

from StringIO import StringIO
import pandas as pd

df = pd.read_csv(StringIO('your_data'),
        delim_whitespace=True)

df.groupby('Ref').mean()

       X    Y
Ref          
11   2.5  8.5
12   6.0  5.0
13   8.5  2.5

最後の行でわかるように、質問の計算を間違えました...

同様に、中央値、合計、最大値などを求めることができます。

于 2013-01-07T18:16:52.587 に答える
1
import csv, collections, operator
def j(): return dict(X=[], Y=[])
def mean(inlist): return operator.truediv(sum(inlist),len(inlist))
a = collections.defaultdict(j)
# get all the data
for line in csv.DictReader(open(myfile, 'r')):
    a[line['Ref']]['X'].append(line['X'])
    a[line['Ref']]['Y'].append(line['Y'])


# now, for the averages themselves

def get_avgs(inputlist, xy):
    return [mean(a[item][xy]) for item in inputlist]

使用する:

get_avgs([11,12,13], 'X')
# returns:
[2.5,6,12.5]
于 2013-01-07T18:06:22.867 に答える
1

必要に応じて、最初にソートせずに、すべてを 1 つのパスで実行できます。

counts = {}
averages = {}
for line in data_file:
    ref = line[0]
    data = map(float, line[1:])
    if ref not in counts:
        counts[ref] = 1
        averages[ref] = data
    else:
        counts[ref] += 1
        averages[ref] = map(lambda running, new: ((running * (counts[ref] - 1)) + new) / counts[ref], averages[ref], data)

defaultdictforcountsとを使用することもできますがaverages、この場合、それを正当化するのに十分なほど明快さや簡潔さには役立たないと思います。

ソートを行わなくても、2 パスで実行した方がおそらく効率的でしょう。

counts = {}
totals = {}
for line in data_file:
    ref = line[0]
    data = map(float, line[1:])
    if ref not in counts:
        counts[ref] = 1
        totals[ref] = data
    else:
        counts[ref] += 1
        totals[ref] = map(lambda running, new: running + new, averages[ref], data)
averages = {ref : map(lambda total: total / counts[ref], totals[ref]) for ref in counts}
于 2013-01-07T18:09:44.950 に答える
1
>>> A=np.array([[11,1,10,],[11,2,9],[11,3,8],[11,4,7],[12,5,6,],[12,6,5],[12,7,4],[13,8,3],[13,9,2]])
>>> A
array([[11,  1, 10],
       [11,  2,  9],
       [11,  3,  8],
       [11,  4,  7],
       [12,  5,  6],
       [12,  6,  5],
       [12,  7,  4],
       [13,  8,  3],
       [13,  9,  2]])
#Slice the data
>>> A[:,0]
array([11, 11, 11, 11, 12, 12, 12, 13, 13])
>>> refs=np.unique(A[:,0])
#Unique value of all references.
>>> refs
array([11, 12, 13])
#To get the average of each column
>>> np.average(A,axis=0)
array([ 11.77777778,   5.        ,   6.        ])

私はあなたがこれが欲しいと思いますか?

#Create a mask
>>> A[:,0]==11
array([ True,  True,  True,  True, False, False, False, False, False], dtype=bool)
>>> Mask=A[:,0]==11
>>> A[Mask]
array([[11,  1, 10],
       [11,  2,  9],
       [11,  3,  8],
       [11,  4,  7]])
>>> np.average(A[Mask],axis=0)
array([ 11. ,   2.5,   8.5])
>>> np.vstack([np.average(A[A[:,0]==x],axis=0) for x in ref])
array([[ 11. ,   2.5,   8.5],
       [ 12. ,   6. ,   5. ],
       [ 13. ,   8.5,   2.5]])

したがって、最終的には次のものを使用できます。

>>> refs=np.unique(A[:,0])
array([11, 12, 13])
>>> np.vstack([np.average(A[A[:,0]==x],axis=0) for x in ref])
array([[ 11. ,   2.5,   8.5],
       [ 12. ,   6. ,   5. ],
       [ 13. ,   8.5,   2.5]])

リストの理解を避けることができるように、より高次元の行列を導入することでそれを行うより良い方法があります。

于 2013-01-07T17:52:32.250 に答える
0

数十万行未満の場合は、numpy を気にすることさえしません...なぜこれを使用しないのですか:

#assuming your data is a list of lists and you want the average of the 2nd column
avg = sum(x[1] for x in mydata) / len(mydata)

もちろん、何らかの式に一致するすべてのアイテムの平均のみが必要な場合は、リスト内包表記を使用してデータをフィルター処理し、結果のリストの平均を計算します。

my_specific_data = [x[1] for x in mydata if x[0] == refs]
#... avg as above
于 2013-01-07T18:01:23.733 に答える