2016-03-30 13 views
1

現在、Postgresにテーブル変換ステートメントをたくさん書いています。これは、Pythonで繰り返しの量を減らすための関数を書いています。コードがあります。私がPandasにロードするテーブルを持っていて、次のようなものがあるとします。データフレームをワイドからロングに変換してマップを適用する(Python 3.5.1 Pandas)

import pandas as pd 
df = {'state' : ['NJ', 'NJ', 'NY', 'NY'], 
     'county' : ['AAA', 'BBB', 'CCC', 'DDD'], 
     'population' : [100, 200, 300, 400], 
     'other' : [11, 12, 13, 14], 
     'row_number': [1, 2, 3, 4] 
    } 


    county other population row_number state 
0 AAA  11   100   1  NJ 
1 BBB  12   200   2  NJ 
2 CCC  13   300   3  NY 
3 DDD  14   400   4  NY 

私は州と郡の列を保持したいと思います。 otherおよび​​フィールドは実際のデータフィールドを表します。最後に、これらの値をExcelスプレッドシートの列と行にマップしたいと考えています。フィールドrow_numberは、州および郡に対応する行番号を表します。

ここで、2つのデータフィールドと列の間に「マッピング」がある辞書があるとします。私が欲しいので、私は可能な限り最も一般的な方法でこれをやろうとしている、二次的な重要性の

county state   value   row 
0 AAA  NJ   11   A1   
1 AAA  NJ   100   B1 
2 BBB  NJ   12   A2 
3 BBB  NJ   200   B2   
4 CCC  NY   13   A3  
5 CCC  NY   300   B3  
6 DDD  NY   14   A4 
7 DDD  NY   400   B4 

:私はのように見えるデータフレームを生成したいのは、それが

column_mapping = {'other': 'A', 
        'population': 'B' 
       } 

のように見えるとしましょう同様の構造を持ついくつかの異なるテーブルをこの関数に渡すことができますが、異なるカラム名(statecounty、およびrow_numberは常に同じですが、実際のデータフィールドは異なる場合があります)。

答えて

2

あなたがastypeと最後drop不要な列で文字列に整数列をキャストして、列を結合し、その後、mapvariableを再形成するためmeltを使用することができます:あなたはmeltを使用する必要がある場合は

column_mapping = {'other': 'A', 
        'population': 'B' 
       } 

df = pd.melt(df, id_vars=['county','state', 'row_number'], 
       value_vars=['other', 'population']) 

df['variable'] = df['variable'].map(column_mapping) 
df['row'] = df['variable'] + df['row_number'].astype(str) 

df = df.drop(['variable','row_number'], axis=1) 

#if you need sort by county column with reset index 
df = df.sort_values('county').reset_index(drop=True) 
print df 
    county state value row 
0 AAA NJ  11 A1 
1 AAA NJ 100 B1 
2 BBB NJ  12 A2 
3 BBB NJ 200 B2 
4 CCC NY  13 A3 
5 CCC NY 300 B3 
6 DDD NY  14 A4 
7 DDD NY 400 B4 

EDITより一般的には、省略形は省略します。value_vars

df = pd.melt(df, id_vars=['county','state', 'row_number']) 
df['variable'] = df['variable'].map(column_mapping) 
df['row'] = df['variable'] + df['row_number'].astype(str) 
df = df.drop(['variable','row_number'], axis=1) 
df = df.sort_values('county').reset_index(drop=True) 
print df 
    county state value row 
0 AAA NJ  11 A1 
1 AAA NJ 100 B1 
2 BBB NJ  12 A2 
3 BBB NJ 200 B2 
4 CCC NY  13 A3 
5 CCC NY 300 B3 
6 DDD NY  14 A4 
7 DDD NY 400 B4 
+0

ありがとう!これは主に私のために働くが、私は本当に奇妙なエラーが発生している。私は 'pd.read_sql'を使ってクエリを実行し、DataFrameを返します。 'frame = frame.ix [:、id_vars + value_vars]' 'AttributeError: 'タプル'オブジェクトに属性 'ix''がありません。しかし、 'pd.read_sql_table'を直接使うと、私はこのエラーに遭遇しません。何か案は? – Vincent

+0

非常に難しい質問です。 'DataFrames'は' pd.read_sql'と 'pd.read_sql_table'を使って同じですか? 'インデックス 'は同じですか?または、 'Multiindex'と他の' index'を含んでいますか? – jezrael

+0

何時間も後、コードの途中で余分なカンマが掛かっていることがわかりました= [[[[ – Vincent

関連する問題