1

Python 3.2を使用して、以下の問題を解決したいと思っていました。私のデータは、数百行(プロジェクトを意味する)と21列で構成されています。最初の列は一意のプロジェクトIDで、他の20列はプロジェクトを主導した人々のグループまたは人です。person_1は常に入力され、person_3に名前がある場合は、3人が一緒に作業していることを意味します。person_18に名前がある場合、18人が一緒に作業していることを意味します。

次のように設定されたExcelスプレッドシートがあります。

 unique ID person_1      person _2      person_3     person_4   ...  person_20
    12       Tom           Sally          Mike
    16       Joe           Mike
    5        Joe           Sally
    1       Sally          Mike           Tom
    6       Sally          Tom            Mike
    2       Jared          Joe            Mike        John      ...     Carl

私はいくつかのことをしたい:

1)一意のID 1を例として使用して、一意の「グループ名」を与える列を作成します。Sally/ Mike/Tomです。したがって、「/」で区切られた名前になります。

2)私の例から、Sally / Mike/TomをSally/Tom/Mikeと同じように扱うにはどうすればよいですか。つまり、グループ名をアルファベット順に(実際の順列に関係なく)、「/」で区切った別の列が必要です。

3)この質問は(2)に似ています。ただし、person_1にリストされている人は重要です。意味ジョー/トム/マイクはトム/ジョー/マイクとは異なりますが、ジョー/マイク/トムとは異なりません。したがって、グループ名の先頭にperson_1を保持するが、該当する場合はperson_2からperson_20までをアルファベット順に並べた別の列があります(つまり、プロジェクトに複数の人がいる場合)。

ヘルプと提案をありがとう

4

2 に答える 2

1

次のことができます。

  1. .csvファイルをExcelからファイルにエクスポートする
  2. を使用して、 Pythonのcsvモジュールを使用してその入力ファイルを開きますcsv.reader
  3. 別のファイル(出力)を開いて、を使用して書き込みますcsv.writer
  4. リーダーの各行を繰り返し、処理を行い、ライターを使用してそれを記述します
  5. 出力ファイルをExcelにインポートします
于 2012-10-21T17:50:04.443 に答える
1

前の回答はメソッドの明確なステートメントを示しましたが、おそらく文字列処理またはcsv処理のいずれかで立ち往生しています。両方とも次のコードで示されています。関連する文字列メソッドはとsortedですjoin。 結合されたアイテム間の区切り文字として使用するように'/'.join指示します。リスト内の演算子とステートメントの間の演算子は、リストを連結します。Aは、行ごとに1つのリストを配信するイテレーターであり、はリストを行に変換して書き出します。ファイルを開くなどにエラーテストを追加する必要があります。このコードのテストに使用されるデータファイルは、コードの後に​​表示されます。join/+tnamewriterowcsv.readercsv.writer

import csv
fi = open('xgroup.csv')
fo = open('xgroup3.csv', 'w')
w = csv.writer(fo)
r = csv.reader(fi)
li = 0
print "Opened reader and writer"
for row in r:
    gname = '/'.join(row[1:])
    sname = '/'.join(sorted(row[1:]))
    tname = '/'.join([row[1]]+sorted(row[2:]))
    w.writerow([row[0], gname, sname, tname]+row[1:])
    li += 1
fi.close()
fo.close()
print "Closed reader and writer after",li,"lines"

次にファイルxgroup.csvを示します。

unique-ID,person_1,person,_2,person_3,person_4,...,person_20
12,Tom,Sally,Mike
16,Joe,Mike
5,Joe,Sally
1,Sally,Mike,Tom
6,Sally,Tom,Mike
2,Jared,Joe,Mike,John,...,Carl

上記のようにデータを読み取ると、プログラムは次に示すようにファイルに出力を出力して生成しOpened reader and writerます。Closed reader and writer after 7 linesxgroup3.csv

unique-ID,person_1/person/_2/person_3/person_4/.../person_20,.../_2/person/person_1/person_20/person_3/person_4,person_1/.../_2/person/person_20/person_3/person_4,person_1,person,_2,person_3,person_4,...,person_20
12,Tom/Sally/Mike,Mike/Sally/Tom,Tom/Mike/Sally,Tom,Sally,Mike
16,Joe/Mike,Joe/Mike,Joe/Mike,Joe,Mike
5,Joe/Sally,Joe/Sally,Joe/Sally,Joe,Sally
1,Sally/Mike/Tom,Mike/Sally/Tom,Sally/Mike/Tom,Sally,Mike,Tom
6,Sally/Tom/Mike,Mike/Sally/Tom,Sally/Mike/Tom,Sally,Tom,Mike
2,Jared/Joe/Mike/John/.../Carl,.../Carl/Jared/Joe/John/Mike,Jared/.../Carl/Joe/John/Mike,Jared,Joe,Mike,John,...,Carl

次のようなデータ行があることに注意してください

5,Joe,Sally,,,,,

それ以外の

5,Joe,Sally

上記のプログラムは

5,Joe/Sally/////,/////Joe/Sally,Joe//////Sally,Joe,Sally,,,,,

それ以外の

5,Joe/Sally,Joe/Sally,Joe/Sally,Joe,Sally

それが問題である場合は、空のエントリを除外します。たとえば、の場合
row=['5', 'Joe', 'Sally', '', '', '', '', '']、は、を '/'.join(row[1:])生成し
'Joe/Sally/////'、一方
'/'.join(filter(lambda x: x, row[1:]))
'/'.join(x for x in row[1:] if x)およびはを
'/'.join(filter(len, row[1:]))生成し
'Joe/Sally'ます。

于 2012-10-21T21:01:27.297 に答える