2017-02-01 8 views
1

挨拶!複数の列から行の値を反復的に追加するパンダ

複数の列の行の値を、グループに基づいて新しいdfの新しい列に繰り返し追加したいとします。

私の目標は、顧客ごとに1行、タイムラインに1列、各イベントの日付、イベントの説明、すべての日付とイベントを時系列順に並べたものです。

私はこれを一連の辞書で解決しました。

import pandas as pd 

df_have = pd.DataFrame({'Customer_ID':['customer_1','customer_1','customer_1','customer_2','customer_2'], 
         'Event':['purchased cornflakes','purchased eggs', 'purchased waffles','sold eggs','purchased cows'], 
          'Date':['2011-06-16','2011-06-13','2011-06-09','2011-06-13','2011-06-18']}) 

df_have['Date'] = pd.to_datetime(df_have['Date']) 

df_have.sort_values(['Customer_ID','Date'], inplace =True) 
df_have 

df I currently have

:私は

など、イベント、このコードは、顧客への小さな変化で頻繁に実行されるように、これを実現するために、クリーンでエレガントな、パンダ風の道を探しています
df_want = pd.DataFrame({'Customer_ID':['customer_1','customer_2'], 
         'Time_Line':[['2011-06-09,purchased waffles,2011-06-13,purchased eggs,2011-06-16,purchased cornflakes'], 
            ['2011-06-13,sold eggs,2011-06-18,purchased cows']]}) 
df_want 

df I'd like to have

答えて

2

ステップ:

1)操作中常に静的であるため、Customer_IDをインデックス軸と設定します。

2)stack互いに下回るDateEventように。

3)groupby w.rtの索引(level=0)で、唯一の列をlistに変換します。私たちはこの順序でそれらを積み重ねたので、交互に現れます。


# set maximum width of columns to be displayed 
pd.set_option('max_colwidth', 100) 

df_have.set_index('Customer_ID').stack(
    ).groupby(level=0).apply(list).reset_index(name="Time_Line") 

enter image description here


配列がlist内部で発生する順序を変更するには:Maveli @Nickil

df_have.set_index('Customer_ID').reindex_axis(['Event', 'Date'], axis=1).stack(
    ).groupby(level=0).apply(list).reset_index(name="Time_Line") 

enter image description here

+0

おかげで、これはbeautifありますul! stack()はdf_have.columnsに基づいて注文を選択していますか?たとえば、スタックの順序を変更するにはどうすればよいですか(たとえば、Date、EventではなくEvent、Date)?列名の文字列のリストを渡そうとしましたが、それは動作しません。 –

+0

私の投稿を更新しました。 –

+1

素晴らしい。ありがとうございました。それは私にとっては直感的ではありませんでした。 –

関連する問題