8

テキスト ファイルは次のようになります。

david weight_2005 50
david weight_2012 60
david height_2005 150
david height_2012 160
mark weight_2005 90
mark weight_2012 85
mark height_2005 160
mark height_2012 170

次のようにデビッドとマークの体重と身長の平均を計算する方法:

david>> mean(weight_2005 and weight_2012), mean (height_2005 and height_2012)
mark>> mean(weight_2005 and weight_2012), mean (height_2005 and height_2012)

私の不完全なコードは次のとおりです。

 import numpy as np
 import csv
 with open ('data.txt','r') as infile:
   contents = csv.reader(infile, delimiter=' ')
   c1,c2,c3 = zip(*contents)
   data = np.array(c3,dtype=float)

次に、np.mean を適用する方法??

4

4 に答える 4

5

このmean関数は、数値の配列の平均を計算するためのものです。c3に条件を適用して の値を選択する方法を考える必要がありますc2

おそらくあなたのニーズにより適しているのは、データを階層構造に分割することです。私は辞書を使用することを好みます。何かのようなもの

data = {}
with open('data.txt') as f:
    contents = csv.reader(f, delimiter=' ')
for (name, attribute, value) in contents:
    data[name] = data.get(name, {})  # Default value is a new dict
    attr_name, attr_year = attribute.split('_')
    attr_year = int(attr_year)
    data[name][attr_name] = data[name].get(attr_name, {})
    data[name][attr_name][attr_year] = value

dataのようになります

{
    "david": {
        "weight": {
            2005: 50,
            2012: 60
        },
        "height": {
            2005: 150,
            2012: 160
        }
    },
    "mark": {
        "weight": {
            2005, 90,
            2012, 85
        },
        "height": {
            2005: 160,
            2012: 170
        }
    }
}

それからあなたができることは

david_avg_weight = np.mean(data['david']['weight'].values())
mark_avg_height = np.mean([v for k, v in data['mark']['height'].iteritems() if 2008 < k])

ここでも を使用してnp.meanいますが、通常の Python リストでのみ呼び出しています。

于 2013-11-12T16:48:34.710 に答える
4

このコミュニティ wiki を作成します。これは、「質問に対する回答がここにある」というよりも、「代わりに行うべきだと思う方法は次のとおりです」だからです。このようなものには、グループ化ツールの方がはるかに優れているため、おそらくpandasの代わりに使用します。に基づくアプローチ numpyと比較することも役立ちます。numpy

import pandas as pd
df = pd.read_csv("data.txt", sep="[ _]", header=None, 
                 names=["name", "property", "year", "value"])
means = df.groupby(["name", "property"])["value"].mean()

..そして、ええと、それだけです。


まず、データを に読み込み、DataFrame空白または_個別の列を許可します。

>>> import pandas as pd
>>> df = pd.read_csv("data.txt", sep="[ _]", header=None, 
                 names=["name", "property", "year", "value"])
>>> df
    name property  year  value
0  david   weight  2005     50
1  david   weight  2012     60
2  david   height  2005    150
3  david   height  2012    160
4   mark   weight  2005     90
5   mark   weight  2012     85
6   mark   height  2005    160
7   mark   height  2012    170

次に と でグループ化しname、列propertyを取り、value平均を計算します。

>>> means = df.groupby(["name", "property"])["value"].mean()
>>> means
name   property
david  height      155.0
       weight       55.0
mark   height      165.0
       weight       87.5
Name: value, dtype: float64

.. さて、このsep="[ _]"トリックは実際のコードには少しかわいすぎますが、ここでは十分に機能します。実際には、空白区切りを使用し、2 番目の列を次のように読み込んでproperty_yearから実行します。

df["property"], df["year"] = zip(*df["property_year"].str.split("_"))
del df["property_year"]

他の列でアンダースコアを許可します。

于 2013-11-12T17:04:15.960 に答える