0

以下のデータを .txt ファイルから読み取り、Python List オブジェクトに保存しました。
以下は、そのリスト オブジェクトの行の出力です。

Year Month OtherValue
(1977, 10) 52
(1843, 9) 0
(1946, 6) 83
(1891, 3) 11
(2001, 5) 69
(1868, 7) 27
(1916, 9) 20
(1871, 10) 60
(1845, 3) 46
(1919, 12) 26
(1832, 8) 0
(1880, 2) 23
(1933, 8) 0
(2007, 1) 20
(1930, 11) 51
(1920, 3) 20

...

行を年ごと、次に月ごとにグループ化する必要があります。次に、新しい列で月平均を計算します。年、月、および月平均は、次の形式で新しい .txt ファイルに書き込まれます。

Year Month Averages
2011 01    34.875
2011 02    29.897
2011 03    13.909
....

親切なアドバイス。

4

2 に答える 2

1

次を使用しdefaultdictます。

例:

>>> from collections import defaultdict
>>> lis = [(2011, 1, 50), (2012, 1, 5), (2011, 1, 35), (2012, 1,  15), (2013, 5, 37), (2011, 3, 45)]
>>> dic = defaultdict(lambda :defaultdict(list))
>>> for year, month, val in lis:
    dic[year][month].append(val)
...     
>>> dic
defaultdict(<function <lambda> at 0x896afb4>,
{2011: defaultdict(<type 'list'>, {1: [50, 35], 3: [45]}),
 2012: defaultdict(<type 'list'>, {1: [5, 15]}),
 2013: defaultdict(<type 'list'>, {5: [37]})})

2011 年の最初の月の平均:

>>> sum(dic[2011][1])/float(len(dic[2011][1]))
42.5
于 2013-10-26T20:20:47.140 に答える
0

を使用list.sort()して、リスト内の値を日付順に並べ替えてから、 を使用itertools.groupbyしてそれらをグループ化できます。groupbyがリストではなくイテレータを返すという事実によって、少しトリッキーになっています (したがって、イテレータにはlen.

from itertools import groupby
from operator import itemgetter

data = [(1977, 10, 52), (1977, 11, 20), (1977, 10, 0)] # example data

key = itemgetter(0, 1) # a callable to get year and month from data values
data.sort(key=key)
groups = [(date, [value for y, m, value in group]) for date, group in groupby(data, key)]
averages = [date + (sum(values) / len(values),) for date, values in groups]

# for example data, averages will be [(1977, 10, 26.0), (1977, 11, 20.0)]
于 2013-10-26T20:41:59.177 に答える