2017-04-20 10 views
2
質問

私はこのCSVテーブルデータ処理

enter image description here

のようなテーブルを見て、私は、各郡のための最大パーセンテージスコアをフィールドを追加する必要があります。たとえば99.03833の場合、Anderson Countyの最大得点はHAZ_7です。最初の行はスコアを表します。各行の数字はスコアのパーセンテージを表します。私は各郡の大半の得点が必要です。

エクセルまたはパイソンのいずれの方法でも、どのようにそれを行うことができますか?

+0

だから、あなたはテキスト '%のHAZ_7'が必要その行の新しい列?そして、各行の最大値の列タイトル? – Kyle

+0

はい。私は各行の最大パーセンテージのためのスコアが必要です – alice

+0

だから、いいえ?あなたは '99.03833'を新しい列に表示したいと言っていますか? – Kyle

答えて

1

列名用のExcelソリューション:値の

=INDEX(C$1:L$1,MATCH(MAX(C2:L2),C2:L2,0)) 

Excelのソリューション:

=MAX(B2:L2) 
+0

これは、最大ではなく、最小の列値を返します。結果は正しくない – alice

+0

編集 – zipa

+0

を参照してください。正しい.thanks – alice

0

私は、これはdfと呼ばれるパンダのデータフレームであると仮定します。その場合、以下のpythonは、各行の最大値を含むmaxという名前のDataFrameに列を追加します。

df['max'] = df.loc[:,'%HAZ_1':].max(axis=1) 
+0

Thatsはハザードスコアではなく、最大値を示しています。私は関連する最初の列が必要ですHAZ – alice

+0

あなたの指示が不明確でした。あなたが「得点」と言うとき、私はその価値を仮定しています。 "列見出し"とか、もっと直接的なことを言ってください。 – Kyle

0

ここでは、Pythonで行う方法について説明します。

import csv 

filename = 'county_data.csv' 
output_filename = 'county_data2.csv' 

def maxelements(names, seq): 
    """ Return corresponding names of the position(s) of the largest element in sequence. """ 
    max_value = max(seq) 
    return [names[i] for i, v in enumerate(seq) if v == max_value] 

with open(filename, 'r') as infile, open(output_filename, 'w') as outfile: 
    reader = csv.reader(infile) 
    writer = csv.writer(outfile) 
    fieldnames = next(reader) # assume first row contains field names 
    writer.writerow(fieldnames + ['Max']) # plus name of new field 
    haz_fields = fieldnames[2:] 
    for row in reader: 
     row = row[:2] + [float(elem) for elem in row[2:]] # convert haz fields to numbers 
     maxfields = maxelements(haz_fields, row[2:]) 
     writer.writerow(row + maxfields) 

ここでファイルCVS小さなサンプル入力です:

County,FIPS,%HAZ_1,%HAZ_2,%HAZ_3,%HAZ_4,%HAZ_5,%HAZ_6,%HAZ_7,%HAZ_8,%HAZ_9,%HAZ_10,Max 
Anderson County,48001,0.0,0.0,0.0,0.0,0.0,0.0,99.03833,0.961668,0.0,0.0,%HAZ_7 
Andrews County,48003,0.0,0.0,0.0,0.0,0.0,0.0,26.08,73.92,0.0,0.0,%HAZ_8 
Angelina County,48005,0.0,0.0,0.0,0.0,0.0,62.41924,37.58076,0.0,0.0,0.0,%HAZ_6 
Aransas County,48007,0.0,0.0,100.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,%HAZ_3 

注:maxelements()機能があるため、リストを返す

County,FIPS,%HAZ_1,%HAZ_2,%HAZ_3,%HAZ_4,%HAZ_5,%HAZ_6,%HAZ_7,%HAZ_8,%HAZ_9,%HAZ_10 
Anderson County,48001,0,0,0,0,0,0,99.03833,0.961668,0,0 
Andrews County,48003,0,0,0,0,0,0,26.08,73.92,0,0 
Angelina County,48005,0,0,0,0,0,62.41924,37.58076,0,0,0 
Aransas County,48007,0,0,100,0,0,0,0,0,0,0 

そしてここでは、出力ファイルに書かれたものです同じ最大値を持つ2つ以上のフィールドがある可能性があります(ただし、サンプル入力)。このような状況で何が起こりたいのかを記述していないため、コードは必ずしもこのケースを適切に処理するとは限りません。

それそれは問題ではないのです、あなたは次のバージョンの使用することができ、それを、基本的に、単純に最初のインデックスを返しワンライナー-こと:

def maxelements(names, seq): 
    """ Return corresponding names of the position(s) of the largest element in sequence. """ 
    return [names[seq.index(max(seq))]] 
関連する問題