-2

私はいくつかのデータをソートするのに本当に必死です。Python を使用して CSV で並べ替えたいデータがあります。誰かが助けてくれれば、それは大歓迎です。行数が多すぎる (>1500 万) ため、Excel で並べ替えることができません。

形式は次のとおりです。

X,Y,Level,ID,XYID
15.5,16.5,1.6,HB01,15.516.5
15.5,17.5,1.4,HB01,15.517.5
15.5,18.5,1.7,HB01,15.518.5
15.5,19.5,1.6,HB01,15.519.5
15.5,20.5,1.2,HB01,15.520.5
15.5,20.5,1.9,HB02,15.520.5
15.5,20.5,2.5,HB03,15.520.5
15.5,20.5,2.1,HB04,15.520.5

XYID は、X と Y を連結したテキストです。データを並べ替えて、2 番目のブロックで、最高レベル (3 列目) を持ち、同じ XYID を持つため、出てくる唯一の行が次のようになるようにします。

15.5,20.5,2.5,HB03,15.520.5

そして、最終出力を最初の 4 行を表示する csv ファイルにしたいのは、XYID が異なり、新しい 5 行目が最大レベルを示す行であるためです。

X,Y,Level,ID,XYID
15.5,16.5,1.6,HB01,15.516.5
15.5,17.5,1.4,HB01,15.517.5
15.5,18.5,1.7,HB01,15.518.5
15.5,19.5,1.6,HB01,15.519.5
15.5,20.5,2.5,HB03,15.520.5
4

4 に答える 4

3

次のようなものが機能するはずです。

import csv
import itertools

reader = csv.DictReader(open('input.csv', 'rb'))
groups = itertools.groupby(reader, lambda d: d['XYID'])
result = [max(g, key=lambda d: float(d['Level'])) for k, g in groups]

writer = csv.DictWriter(open('output.csv', 'wb'), reader.fieldnames)
writer.writeheader()
writer.writerows(result)

ここでの考え方は、最初に値に基づいて行をグループ化しXYID、次に値を使用して各グループの最大行を取得することLevelです。

入力 CSV ファイルに値でグループ化された行がまだないXYID場合は、最初に行を次のように並べ替える必要があります。

reader = csv.DictReader(open('input.csv', 'rb'))
rows = sorted(reader, key=lambda d: d['XYID'])
groups = itertools.groupby(rows, lambda d: d['XYID'])
...
于 2012-07-11T17:41:10.200 に答える
1

CSV ファイルを読み取ったり、並べ替え可能な表形式のデータ構造を作成したりできるpandasを参照することをお勧めします。1,500 万行はかなり大きいですが、大きなデータ セットの処理にはかなり適しています。メモリの量などについて。

于 2012-07-11T17:30:06.583 に答える
1

モジュールを使用して、csvすべての行を読み取ることができます。

import csv
import decimal
from operator import itemgetter

f = open('your_file')
csv_reader = csv.reader(f)

rows_list = []

各行の XYID 値を 10 進数に変換します

for row in csv_reader:
  row[4] = decimal.Decimal(row[4])

リスト内のすべての行を PUt

rows_list.append(row)

XYID キーでソートし、出力ファイルに書き込みます。

rows_list.sort(key=itemgetter(4))

1500万行がどれだけのメモリを消費するか、またはどれだけ利用できるかはわかりません。おそらく、Pythonがサポートしているsqliteデータベースに値を書き込むこともできますか?? データをデータベースに書き込み、XYID でソートするすべてのデータを選択するのは非常に簡単です。

于 2012-07-11T17:27:39.130 に答える
0

データをまだソートする必要があると仮定します。

from itertools import groupby

sorter = lambda r : r[4]

sorteddata = sorted(data, key=sorter)

newdata = (max(g, key=lambda r : float(r[2])) for g in groupby(sorteddata, sorter))
于 2012-07-11T17:45:46.883 に答える