2016-05-10 5 views
1

多くの列と数千の行のデータを持つCSVファイルに対して、以下の.pyファイルを作成しました。ここで私が持っているスクリプトは、これまでのところです:CSV列の分割と編集アルファベット順の並べ替え

infile = open("titanic.csv", "rU") 
incsv = csv.reader(infile, delimiter = ',') 
outfile = open("titanicOutput.csv", "w") 
outcsv = csv.writer(outfile, delimiter = ',') 
header = incsv.next() 

rowNum = 0 
for row in incsv: 
(data1, data2, namedata, data4, data5, data6, data7, data8, data9, data10, data11) = row 
if '1' in data1: 
    rowOutput = [namedata, data2, data4, data5] 
    outcsv.writerow(rowOutput) 
    rowNum += 1 

infile.close() 
outfile.close() 

基本的にNameDataです列の情報は、この「スミス、ジョン」などのeveryonesの完全な名前のために提示されます。 姓には最初に名前が続きます。 lastnameとfirstnameを分けて、出力にそれぞれの列を作成する必要があります。既に存在するカンマや引用符はありません。また、lastname列の情報をアルファベット順に提示する必要があります。私はsort()がアルファベット順にいくつかの容量で使われることを知っていますが、分割するのは分かりません。

私はこれまでのところ名前付きデータの列を分割する方法がわかりません。ここには1つの説明がありましたが、私は同様の問題を読むようになりましたが、それはすべての正直なところで私が理解するにはあまりにも複雑でした。恥ずかしがり屋の説明は素晴らしいだろう、ありがとう!

EDIT: Original File Data (Simplified version for illustration) - 
data1 data2 namedata    data4 data5 
0   3  Smith, Mr John   m  22 
1   1  McMahan, Ms Sally  f  38 
1   3  Emmit, Mr Brandon  f  26 

Output csv File (Simplified version for illustration) - 
lastname firstname  data2 data4 
Emmit  Mr Brandon  3  m 
McMahon  Ms Sally   1  f 
Smith  Mr John   3  f 

希望します。

+0

これは本当にばかげた質問かもしれませんが、この投稿にファイルを添付するにはどうすればよいですか? – lonewolf2288

+0

ありがとう、完了!希望が役立ちます。 – lonewolf2288

答えて

0

あなたはこのように、文字列の適切な名前の.split方法を使用してデータを分割することができます

>>> namedata = 'Smith, John' 
>>> last,first = namedata.split(',') 
>>> last 
'Smith' 
>>> first 
' John' 

ます。また、(あなたはどこでもそれを使用していないようです)rowNumトラッカーを必要としません。このバージョンをお試しください:

import csv 

rows = [] 
with open("titanic.csv", "rU") as infile: 
    reader = csv.reader(infile, delimiter=',') 
    next(reader) 
    for row in reader: 
     last,first = row[2].split(',') 
     rows.append([last, first, row[1], row[3], row[4]]) 

# Sort the rows by last name 
sorted_rows = sorted(rows, key=lamdba x: x[0]) 

with open("titanicOutput.csv", "w") as outfile: 
    writer = csv.writer(outfile, delimiter=',') 
    writer.writerows(sorted_rows) 

print('Done') 

Pythonはほとんどのものを並べ替える方法を知っています。あなたはそれを名前のリストを渡した場合、それがアルファベット順にソートする方法を知っている:

>>> names = ['Zack', 'John', 'David'] 
>>> sorted(names) 
['David', 'John', 'Zack'] 
また、逆の順序でソートすることを伝えることができ

>>> sorted(names, reverse=True) 
['Zack', 'John', 'David'] 

これは、単純なリストのために正常に動作しますしかし、あなたの場合はリストのリストを持っているので、ソート時にPythonに何を使うべきかを伝える必要があります。

これは、のキーの引数です。この引数には、並べ替えるオブジェクトを返す関数を渡します。この関数は、リスト内の各項目とともに呼び出され、Pythonがソートに使うものを返すはずです。

私たちの場合、我々のリストの各リストの最初の項目である姓でソートする必要があります。

我々のデータは、次のようになります。

[['John', 'Smith', 1, 3, 4], ['Avery', 'Jones', 1, 3, 4]] 

我々は(姓)で、各内側のリストの最初の値でソートしたいです。私たちが書き込み機能は、各項目(リスト)を渡されますので、我々はちょうど最初の項目を返すために必要があります:私たちが望むよう

def sort_by(item): 
    return item[0] 

sorted(names, key=sort_by) 

は今作品を並べ替え:

>>> names = [['John', 'Smith', 1, 3, 4], ['Avery', 'Jones', 1, 3, 4]] 
>>> def sort_by(item): 
... return item[0] 
... 
>>> sorted(names, key=sort_by) 
[['Avery', 'Jones', 1, 3, 4], ['John', 'Smith', 1, 3, 4]] 

ラムダだけです関数を書くためのショートカットです。sort_byメソッドは、ソートの目的以外の場所では使用されない可能性が高いので、実際に定義する必要はありません。私達はちょうどラムダにそれを変換し、それを直接渡すことができます:

>>> sorted(names, key=lambda item: item[0]) 
[['Avery', 'Jones', 1, 3, 4], ['John', 'Smith', 1, 3, 4]] 
0

私が正しく理解していれば、あなたのようなフィールドを持っている:

name = "Smith, John" 

しかし、あなたのようなリストたい:

["John", "Smith"] 
first_last = names.split(', ') 
first_last.reverse() 
print first_last 
のために何かを行うことができます:

並べ替えのために、たくさんの方法があるようにバインドされていますし、これが最もエレガントではないかもしれないが、あなたは辞書を作成することができ、キーセットを並べ替えるし、対応する値をプリントアウト:

後者は
phonebook = dict() 

for row in csv: 
    last_name = get_last_name() 
    phonebook[last_name] = row 

lastnames = phonebook.keys() 
lastnames.sort() 
for key in lastnames: 
    print phonebook[key] 

ほぼ卸売でhttps://stackoverflow.com/a/13990710/695787から取られました。しかし、おそらく重複姓のために失敗します。

関連する問題