-1

uniquenameclass日付ごとにグループ化できるようにする必要があるデータセットがいくつかあります。以下の例のデータでは などを使用UniqueNameClass1してUniqueNameClass3いますが、実際にはテキスト文字列のみになります。したがって、私ができる必要があるのは、csv を循環して、すべて同じ日付のグループを選択してから、この日付グループ内でUniqueNameClass. これを理解するのが難しい場合は、うまくいけば、この例が私が抱えている問題に光を当てるでしょう:

生データ

text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass1,text,text 
text,text,text,13/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass2,text,text

日付でソートされ、UniqueNameClass でグループ化されたデータ

text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass5,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass4,text,text
text,text,text,13/03/12,text,text,text,UniqueNameClass5,text,text

したがって、同じ日付のデータのみを でグループ化できますUniqueNameClass。この例では、実際にはグループを時系列に配置しましたが、グループの順序は問題ではありません。特定の日付の各グループの各行が互いに隣り合っているだけです。

編集

phihag から提供されたコードを実行しようとしましたが、かなりの方法で実行しましたが、試したすべての方法でトレースバックが得られました。

File "C:\RawDataeDataTest.py", line 6, in <module>
    data = list(csv.reader(io.StringIO('RawDataeDataTest.csv')))
TypeError: initial_value must be unicode or None, not str

提供されたコードと提供されたコメントの両方に従って機能すると私が考えたコードは次のとおりです。

import csv
import io

data = list(csv.reader(io.StringIO('RawDataeDataTest.csv')))
data.sort(key=lambda row: (row[3], row[7]))
print(u'\n'.join(u','.join(row) for row in data))

import csv
import io

data = list(csv.reader('RawDataeDataTest.csv'))
data.sort(key=lambda row: (row[3], row[7]))
print(u'\n'.join(u','.join(row) for row in data))

後者の場合、実際には別のトレースバックが得られます。

Traceback (most recent call last):
  File "C:\RawDataeDataTest.py", line 7, in <module>
    data.sort(key=lambda row: (row[3], row[7]))
  File "C:\RawDataeDataTest.py", line 7, in <lambda>
    data.sort(key=lambda row: (row[3], row[7]))
IndexError: list index out of range
4

1 に答える 1

4

次のように、適切なフィールドを抽出するkey関数を提供するだけです。sort

import csv
import io

s = u'''text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,10/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,10/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,10/03/12,text,text,text,UniqueNameClass5,text,text'''

data = list(csv.reader(io.StringIO(s)))
data.sort(key=lambda row: (row[3], row[7]))
print(u'\n'.join(u','.join(row) for row in data))

定数文字列の代わりにファイルから読み取るには、開いているファイルを渡すだけです。

with open('RawDataeDataTest.csv', 'rb') as csvf:
    data = list(csv.reader(csvf))
data.sort(key=lambda row: (row[3], row[7]))
print(u'\n'.join(u','.join(row) for row in data))

結果を同じファイルに再度保存する場合は、最初に一時ファイルに書き込み、次にアトミックに移動します。

import csv
import functools
import io
import tempfile
import os
import sys

filename = 'RawDataeDataTest.csv'

if sys.version_info >= (3, 0):
    open_args = lambda mode: {'encoding': 'utf-8', 'mode': mode}
else:
    open_args = lambda mode: {'mode': mode + 'b'}

with io.open(filename, **open_args('r')) as csvf:
    data = list(csv.reader(csvf))
data.sort(key=lambda row: (row[3], row[7]))


with tempfile.NamedTemporaryFile(dir=os.path.dirname(filename), delete=False,
                                 **open_args('w')) as of:
    try:
        csv.writer(of).writerows(data)
        of.flush()
    except:
        os.unlink(of.name)
        raise

    try:
        os.replace(of.name, filename)
    except AttributeError:  # Python < 3.3
        if os.name == 'nt':
            os.remove(filename)
        os.rename(of.name, filename)
于 2013-10-12T22:32:37.923 に答える