2016-05-06 8 views
0

私は、次の列と要約統計結果から結果があります。ピボット列とは、最初の3つの列に基づいてマージ

  1. TOWN
  2. SETTLEMENTNAME
  3. NAME
  4. TIME
  5. FREQUENCY

私はPython PandasとNumを使って次のコードを書いていますPY:

''' 
Created on April 6, 2016 

Summarise Number of Buildings 

per Time Interval 

(5, 10, 15, 25, 30, 60) 

@author: PeterW 
''' 
# import site-packages and modules 
from pathlib import Path 
import numpy.lib.recfunctions as rfn 
import pandas as pd # Pandas version 0.13.0 
import arcpy 

# set arguments 
saa_stats_table = r"E:\Projects\2016\G112224\Models\Schools\Schools_Combined_160505.gdb\Botrivier_Prim_SAA_Stats" 

# environment settings 
arcpy.env.overwriteOutput = True 
fgdb = Path(saa_stats_table).parents[0] 


def pivot_table(saa_stats_table, fgdb): 
    fields = [f.name for f in arcpy.ListFields(saa_stats_table)] 
    table_recarray = arcpy.da.TableToNumPyArray(saa_stats_table, fields) # @UndefinedVariable 
    print table_recarray 
    df = pd.DataFrame(table_recarray[fields]) 
    pivot = df.pivot(index="OBJECTID", 
        columns="TIME", 
        values="FREQUENCY").fillna(0, downcast="infer") 
    pivot_fields = pivot.columns.values 
    # rename pivot fields with prefix "TIME" 
    pivot.columns = [("{0}{1}".format("TIME", field)) for field in pivot_fields] 
    # convert pandas dataframe to record array 
    pivot_recarray = pivot.to_records(index=False) 
    pivot_type = pivot_recarray.dtype.descr 
    pivot_type_new = [(x[0], x[1].replace(x[1], "<i2")) for x in pivot_type] 
    # change pivot record array data type to short integer 
    pivot_recarray = pivot_recarray.astype(pivot_type_new) 
    fields2 = ["TOWN", "SETTLEMENTNAME", "NAME"] 
    table_type_new = [(str(x), "<U25") for x in fields2] 
    # change table array data type to unicode 50 characters 
    table_recarray = table_recarray[fields2].astype(table_type_new) 
    recarray_list = [table_recarray, pivot_recarray] 
    # merge table and pivot record array 
    summary_array = rfn.merge_arrays(recarray_list, flatten=True, usemask=False) 
    summary_table = str(Path(fgdb, "SAA_Stats_Test")) 
    # convert merged record array to file geodatabase table 
    if arcpy.Exists(summary_table): 
     arcpy.Delete_management(summary_table) 
     arcpy.da.NumPyArrayToTable(summary_array, summary_table) # @UndefinedVariable 
    else: 
     arcpy.da.NumPyArrayToTable(summary_array, summary_table) # @UndefinedVariable 

pivot_table(saa_stats_table, fgdb) 

私は取得していた結果は以下のとおりです。最初の3つの列がケースフィールドと残りはどこされているところ

enter image description here

私が探している結果でありますTIME5 - TIME 60は、新しい列として設定されています。

enter image description here

私は最初の3つのフィールドを崩壊するかどうかはわかりません: "TOWN"、 "SETTLEMENTNAME"、 "NAME"、および "TIME"フィールドを設定します。アドバイスをいただければ幸いです。

答えて

0

あなたは、必要に応じてDataFrameを再形成する.stack().unstack()を使用することができます。

dfを皮切り:

 TOWN SETTLEMENT   NAME TIME5 TIME10 TIME15 TIME20 \ 
0 Botrivier New France Botrivier Prim  0  0  0  0 
1 Botrivier New France Botrivier Prim  0  0  0  100 

    TIME25 TIME30 TIME60 
0  200  0  0 
1  0  0  0 

あなたが得た.stack()

df = df.set_index(['TOWN', 'SETTLEMENT', 'NAME']).stack() 

を使用することができます。この時点で

TOWN  SETTLEMENT NAME     
Botrivier New France Botrivier Prim TIME5  0 
             TIME10  0 
             TIME15  0 
             TIME20  0 
             TIME25 200 
             TIME30  0 
             TIME60  0 
             TIME5  0 
             TIME10  0 
             TIME15  0 
             TIME20 100 
             TIME25  0 
             TIME30  0 
             TIME60  0 

を、あなたは複数のについて何をすべきかを決定する必要があります0の値はそれぞれ.unstack()は重複するインデックス値に対しては機能しません。

簡単な方法は、0値を取り除くためにも、必要であれば、おそらく、後0値でTIMEcolumnsを追加します。

df[df!=0].unstack().reset_index() 

は、生成:

 TOWN SETTLEMENT   NAME TIME20 TIME25 
0 Botrivier New France Botrivier Prim 100.0 200.0 

は、この情報がお役に立てば幸いです。

+0

結局のところ、この手助けをしましたか? – Stefan

関連する問題