2016-09-07 4 views
4

に類似した複数の列を作成するには、のは、私のデータは次のようになりましょう:パンダ - pd.get_dummies

df = pd.DataFrame({'color': ['red', 'blue', 'green', 'red', 'blue', 'blue'], 'line': ['sunday', 'sunday', 'monday', 'monday', 'monday', 'tuesday'], 
       'group': ['1', '1', '2', '1', '1', '1'], 'value': ['a', 'b', 'a', 'c', 'a', 'b']}) 

    color group line value 
0 red  1  sunday a 
1 blue  1  sunday b 
2 green  2  monday a 
3 red  1  monday c 
4 blue  1  monday a 
5 blue  1 tuesday b 

は基本的に、私が欲しいのは、各色の行のリストを取得することです。たとえば、赤色には、それぞれの行とそれに関連する値をそれぞれの列に表示する必要があります。そのトリックは、同じグループの色に関連する他の線も表示したいということです。それらの対応する値は「適格ではない」でしょう。したがって、私は私の出力は次のようになりたい:私はこれを行うために必要ないくつかの〜50,000ユニークな「色」は

color line_1 line_1_value line_2 line_2_value line_3  line_3_value 
0 red  sunday  a   monday  c   tuesday not eligible 
1 blue sunday  b   monday  a   tuesday   b 
2 green monday  c  

があります。私はそれが比較的シンプルなものだと確信していますが、それを理解するための知識やスキルをまだ持っていません。どんな助けもありがとう!

答えて

0

ドロップあなたは色ごとにユニークなサブインデックスを取得する列を必要とし、追加しないコラム:必要なデータの向きを取得するために

df = df.drop('group', axis=1) 
df['index_by_color'] = df.groupby('color').cumcount() 

    color  line value index_by_color 
0 red sunday  a    0 
1 blue sunday  b    0 
2 green monday  a    0 
3 red monday  c    1 
4 blue monday  a    1 
5 blue tuesday  b    2 

使用pivot_tableを:

df.pivot_table(index='color', columns=['index_by_color'], aggfunc=lambda x:x.iloc[0]) 

        line     value 
index_by_color  0  1  2  0  1  2 
color 
blue   sunday monday tuesday  b  a  b 
green   monday None  None  a None None 
red    sunday monday  None  a  c None 

aggfunc=lambda x:x.iloc[0]については、数値以外のピボットデータを特定の値として減らすことです。サブフレームの最初の要素は、データ構造の統一性によって十分です。

並べ替え列の階層的インデックス:

res = res.sort_index(axis=1, level=1) 

        line value line value  line value 
index_by_color  0  0  1  1  2  2 
color 
blue   sunday  b monday  a tuesday  b 
green   monday  a None None  None None 
red    sunday  a monday  c  None None 

あなたは、1ではなく0に番号付けを開始書き込み/列をフラット化する必要がある場合は、残りの部分はcumcount()+1のようなあなたが必要な正確なプレゼンテーションに応じて些細なクリーンアップされていますあなたがなどres.columns =['_'.join([l0, str(l1)]) for l0,l1 in res.columns]または同等の、

+0

を。これは、CLOです私が探しているものにはse。ただし、グループ内の別の色に関連付けられている行は考慮されません。したがって、 'red'のLine_2は火曜日に表示され、対応する値は '適格でない'と表示されます – tbg0001

+0

最初のステップとしてデータフレームを修正するには、各グループのvalue列に 'not eligible'を追加し、グループを削除して上のアルゴリズムに進みます。重要なアイデアは、ピボットを適用する前に、必要なすべてを使ってデータフレームを準備することです。あなたはここで論理を見守っていますか? – Boud

+0

データフレームの最後に追加のレコードを追加する方法を知ることができました。将来のために、すべての機能を1つの機能にまとめました。ご協力いただきありがとうございます! – tbg0001

0

が2でマージを考えてみたいと名前が列名の取り扱いにDFSを旋回さ:

df['count'] = df.groupby('color').cumcount() + 1 

pvt1 = df.pivot(columns='count', index='color', values='line').reset_index().fillna('') 
pvt1.columns = ['color'] + ['line_'+str(c) for c in pvt1.columns[1:]] 

pvt2 = df.pivot(columns='count', index='color', values='value').reset_index().fillna('') 
pvt2.columns = ['color'] + ['line_'+str(c)+'_value' for c in pvt2.columns[1:]] 

pvtdf = pd.merge(pvt1, pvt2, on=['color']) 
pvtdf = pvtdf[[c for c in sorted(pvtdf.columns)]] 

# color line_1 line_1_value line_2 line_2_value line_3 line_3_value 
# 0 blue sunday   b monday   a tuesday   b 
# 1 green monday   a           
# 2 red sunday   a monday   c      
+0

これは私が探しているものに近いです。ただし、グループ内の別の色に関連付けられている行は考慮されません。 Line_3の 'red'は火曜日に表示され、対応する値は 'not eligible'と表示されます。 – tbg0001