2017-12-26 19 views
1

私は電子メールデータなどの広告データを扱っています。一人一人のために、彼らは変換された何の日、その後の日は、彼らが郵送されたかを述べ、その、メールレベルでforループなしで効率的にデータフレームを作成

  1. 1:私は2つのデータセットを持っています。

    import pandas as pd 
    
    df_emailed=pd.DataFrame() 
    df_emailed['person']=['A','A','A','A','B','B','B'] 
    df_emailed['day']=[2,4,8,9,1,2,5] 
    df_emailed 
    print(df_emailed) 
    
        person day 
    0  A 2 
    1  A 4 
    2  A 8 
    3  A 9 
    4  B 1 
    5  B 2 
    6  B 5 
    
  2. 誰かが変換したかどうかを示す要約データフレームがあります。

    df_summary=pd.DataFrame() 
    df_summary['person']=['A','B'] 
    df_summary['days_max']=[10,5] 
    df_summary['convert']=[1,0] 
    print(df_summary) 
    
        person days_max convert 
    0  A  10  1 
    1  B   5  0 
    

私は一人一人のために、と言う最後のデータフレームの中にこれらを結合したいと思います:最大の日付に

  • 1、彼らは電子メールで送信されたかどうか
  • (0,1)データフレームの最終日に
  • 変換されたかどうか(0,1)。

データフレームの最終日に変換されているものとします。

私はこれをネストされたforループを使って行うことを知っていますが、私はそれが信じられないほど非効率で、ばかなことだと思います。誰もこれを行う効率的な方法を知っていますか?

望ましい結果

df_final=pd.DataFrame() 
df_final['person']=['A','A','A','A','A','A','A','A','A','A','B','B','B','B','B'] 
df_final['day']=[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5] 
df_final['emailed']=[0,1,0,1,0,0,0,1,1,0,1,1,0,0,1] 
df_final['convert']=[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0] 
print(df_final) 

    person day emailed convert 
0  A 1  0  0 
1  A 2  1  0 
2  A 3  0  0 
3  A 4  1  0 
4  A 5  0  0 
5  A 6  0  0 
6  A 7  0  0 
7  A 8  1  0 
8  A 9  1  0 
9  A 10  0  1 
10  B 1  1  0 
11  B 2  1  0 
12  B 3  0  0 
13  B 4  0  0 
14  B 5  1  0 

あなたと幸せな休日をありがとうございました!

+0

素晴らしいキャッチありがとうございました。 –

答えて

1

高度なアプローチでは、df_summary(エイリアスdf2)を変更して出力します。私たちは、df2days_max列に

  • ​​操作する必要があります。また、インデックスにperson
  • applyreindex操作上のグループへ
  • groupbyを(後に役立ちます)daysに名前を変更します(日、私たちは最終日件までをリードする日ごとに行を取得します)私たちは、後に設定しますemailedのためのダミー列を作成するためにREINDEX
  • assignの結果として生成さconvert列にNaNを埋めるために
  • fillna

次に、df_emailedを使用して、前の操作の結果にインデックスを付けます。これらの値を使用して、対応するemailedセルを1に設定します。これは、マルチインデックス化によってlocで行われます。

最後に、reset_indexを使用して、インデックスを列として取り出します。

def f(x): 
    return x.reindex(np.arange(1, x.index.max() + 1)) 

df = df2.set_index('days_max')\ 
     .rename_axis('day')\ 
     .groupby('person')['convert']\ 
     .apply(f)\ 
     .fillna(0)\ 
     .astype(int)\ 
     .to_frame()\ 
     .assign(emailed=0) 

df.loc[df1[['person', 'day']].apply(tuple, 1).values, 'emailed'] = 1 
df.reset_index() 

    person day convert emailed 
0  A 1  0  0 
1  A 2  0  1 
2  A 3  0  0 
3  A 4  0  1 
4  A 5  0  0 
5  A 6  0  0 
6  A 7  0  0 
7  A 8  0  1 
8  A 9  0  1 
9  A 10  1  0 
10  B 1  0  1 
11  B 2  0  1 
12  B 3  0  0 
13  B 4  0  0 
14  B 5  0  1 

どこ

df1 = df_emailed 

と、

df2 = df_summary 
+0

私は幸せではなく、私は幸せではなく、私は幸せではありません。 –

+0

@TrexionKameha私は答えがあなたに役立つと思います。ハッピーホリデー:-) –

+0

はい!ありがとうございました。たとえば、キャンペーンなど、キーに別の列を追加するにはどうすればよいですか?人物AのIEと人B、私はX、Y、Zのキャンペーンを持っていましたが、それぞれのステップでコンバートしたいと思います。それは簡単ですか?私は自分自身を試して、重複したキーで問題に遭遇しました。 –

関連する問題