2017-12-18 6 views
-1

私はデータフレームに20列あります。 私はここでは例として、それらの4をリスト:pandasデータフレームの複数の列に基づいてパーセンテージカウントを取得するにはどうすればよいですか?

is_guarantee:0または1
hotel_star:0、1、2、3、4、5
ORDER_STATUS:40、60、80
旅(レーベル): 0、1、2

is_guarantee hotel_star order_status journey 
0    0   5   60  0 
1    1   5   60  0 
2    1   5   60  0 
3    0   5   60  1 
4    0   4   40  0 
5    0   4   40  1 
6    0   4   40  1 
7    0   3   60  0 
8    0   2   60  0 
9    1   5   60  0 
10    0   2   60  0 
11    0   2   60  0 

Click to View Image

が、システム機能に入力する次の形式のような生起行列を必要とする:

Click to View Image

体はどんな助けができますか?

df1 = pd.DataFrame(index=range(0,20)) 
df1['is_guarantee'] = np.random.choice([0,1], df1.shape[0]) 
df1['hotel_star'] = np.random.choice([0,1,2,3,4,5], df1.shape[0]) 
df1['order_status'] = np.random.choice([40,60,80], df1.shape[0]) 
df1['journey '] = np.random.choice([0,1,2], df1.shape[0]) 
+1

これまでに何を試みましたか? –

+0

質問で編集したデータを_text_として見たいと思います。画像をコピーして端末に貼り付けることはできません。最初から入力する必要はありません。皆さんの人生を楽にし、あなたのデータとあなたの質問に予想される結果をテキストとして投稿してください。データなし=助けなし。 –

+0

@jezrael ...誰も私を迫害することはありません。私はあなたの知識を尊重すると言った。残念ながら、時々あなたはサイトにとって不健康であると思われることをする。それは私の意見ではありません。とにかく私は質問を再開して楽しんでいます。 –

答えて

1

私はあなたが必要だと思う:meltによって

  • リシェイプとsizegroupbyでカウントを取得し、unstack
  • によって再形成し、その後行ごとに合計を分割し、indexMultiIndexに参加:

df = (df.melt('journey') 
     .astype(str) 
     .groupby(['variable', 'journey','value']) 
     .size() 
     .unstack(1, fill_value=0)) 

df = (df.div(df.sum(1), axis=0) 
     .mul(100) 
     .add_prefix('journey_') 
     .set_index(df.index.map(' = '.join)) 
     .rename_axis(None, 1)) 

print (df) 

        journey_0 journey_1 
hotel_star = 2  100.000000 0.000000 
hotel_star = 3  100.000000 0.000000 
hotel_star = 4  33.333333 66.666667 
hotel_star = 5  80.000000 20.000000 
is_guarantee = 0 66.666667 33.333333 
is_guarantee = 1 100.000000 0.000000 
order_status = 40 33.333333 66.666667 
order_status = 60 88.888889 11.111111 
+0

ありがとう!私はそれを勉強させてください:) – DataHolic

関連する問題