2017-08-09 9 views
2

私があればわからない、そしてどのように私は、次の変換を行うことができます。パンダ:変数の名前と値を含む複数の列:ピボットを使用するには?

私はデータフレームは、このように見えるがあります。

Index Name detail1 detail1_value detail2 detail2_value detail3 detail3_value 
1  Albert Age  30    Group  A   Hometown beautifulplace 
2  Bea  Age  28    Hometown anotherplace None  None 
3  Celin  Age  45    Group  B   None  None 
4  Dave  Group A    None  None   None  None 

しかし、あなたが想像できるように、私の目的は次のとおりです。

Index Name Age Group Hometown 
1  Albert 30 A beautifulplace 
2  Bea  28  anotherplace 
3  Celin  45 B 
4  Dave   A 

私はエッチの詳細がちょうど一度現れると確信しています。 物事を複雑にする:すべての詳細が完全に同一であるかどうかはわかりません(場合によっては、故郷の代わりに故郷など)。

私が今までに見ることができる唯一の解決策は、各ペアの列(detail1とdetail1_valueなど)からsingelピボットテーブルを生成することです。第2のステップでは、新しいデータセットが作成され、これらのピボットテーブルのそれぞれが、例えば年齢に関する情報で検索される。 しかし、Pythonの私の信頼は、より良い方法が必要であることを私に伝えます...

ありがとう!

PS

: は助けるかもしれない:

dataset = pd.DataFrame({'Name': ['Albert', 'Bea', 'Celine', 'Dave'], 
         'detail1': ['Age', 'Age', 'Age', 'Group'], 
         'detail1_value': ['30', '28', '45', 'A'], 
         'detail2': ['Group', 'Hometown', 'Group', None], 
         'detail2_value': ['A', 'anotherplace', 'B', None], 
         'detail3': ['Hometown', None, None, None], 
         'detail3_value': ['beautifulplace', None, None, None]}) 
+0

私はあなたのデータセットで困惑ビットです。例:インデックス2の場合、値Hometownは列detail3に属し、別の場所は列detail3_valueに属しているように見えます。 – vestland

+0

あなたは正しいです。それが私の質問の理由です。同じ状況がインデックス4にあります。ここでは、「グループ」は他の「グループ」と同様にdetail2の代わりにdetail1にあります。それ以外の場合、解決策は単純なピボットになります。 –

+0

その場合、私はあなたの初期データフレームがどのように構築されているか再考すべきだと思います。問題の値を右に2ステップ移動し、なしに置き換えるとピボット操作が簡単になります。 Excelからインポートされたことはありますか? – vestland

答えて

1

あなたはpivotlreshapeを使用することができます。

#get columns names dynamically 
a = dataset.columns[dataset.columns.str.endswith('_value')] 
b = dataset.columns[dataset.columns.str.startswith('detail')].difference(a) 

df = pd.lreshape(dataset, {'detail':b, 'value':a}) 
print (df) 
    Name   value detail 
0 Albert    30  Age 
1  Bea    28  Age 
2 Celine    45  Age 
3 Dave    A  Group 
4 Albert    A  Group 
5  Bea anotherplace Hometown 
6 Celine    B  Group 
7 Albert beautifulplace Hometown 


df = df.pivot(index='Name', columns='detail', values='value') 
print (df) 
detail Age Group  Hometown 
Name        
Albert 30  A beautifulplace 
Bea  28 None anotherplace 
Celine 45  B   None 
Dave None  A   None 

一部のデータを最後の清掃:

df = df.reset_index().rename_axis(None, axis=1) 
print (df) 
    Name Age Group  Hometown 
0 Albert 30  A beautifulplace 
1  Bea 28 None anotherplace 
2 Celine 45  B   None 
3 Dave None  A   None 
+0

ありがとう、このソリューションは私のためにうまくいった。 私はlreshape(前に聞いたnerver)についてもっと知ることに驚くでしょう。再構成の違いと、なぜlreshapeに関する情報が見つからないのですか?とにかく、あなたのソリューションは役に立ちました。 –

+0

嬉しいことに助けてくれる、素敵な一日! – jezrael

1

あなたはデータフレーム2倍を溶かすことができます - それらの値のために一度変数に一度と。次に、名前とこの変数の詳細を使用してそれらをマージします。あなたがvariable列の一意の値を検査し、多分標準化されたバージョンでそれらのいくつかを置き換えることができ故郷対出身地については

id_cols = ['Name'] 
var_cols = ['detail1','detail2','detail3'] 
val_cols = ['detail1_value','detail2_value','detail3_value'] 
val_var_mapping = {k:v for k,v in zip(val_cols, var_cols)} 

# extract variables 
variables = dataset[id_cols+var_cols].melt(id_vars=['Name'], 
              value_name='variable',var_name='detail') 
# print(variables.head()) 
#  Name detail variable 
# 0 Albert detail1  Age 
# 1  Bea detail1  Age 
# 2 Celine detail1  Age 
# 3 Dave detail1 Group 
# 4 Albert detail2 Group 

# extract values 
values = dataset[id_cols+val_cols].melt(id_vars=['Name'], var_name='detail') 
values['detail'] = values['detail'].replace(val_var_mapping) 
# print(values.head()) 
#  Name detail value 
# 0 Albert detail1 30 
# 1  Bea detail1 28 
# 2 Celine detail1 45 
# 3 Dave detail1  A 
# 4 Albert detail2  A 

# merge and pivot 
res = (variables.dropna() 
       .merge(values, on=id_cols+['detail']) 
       .pivot(index='Name',columns='variable',values='value') 
    ) 
# print(res) 
# variable Age Group  Hometown 
# Name         
# Albert  30  A beautifulplace 
# Bea   28 None anotherplace 
# Celine  45  B   None 
# Dave  None  A   None 

:マージされたデータフレームは、以下の例を参照して、ピボットのための準備ができているはずです。

関連する問題